Использование Mockito для издевательства метода класса внутри другого класса
Я пытаюсь написать модульные тесты с помощью Mockito/JUnit для такой функции:
class1 {
method {
object1 = class2.method // method that I want to fake the return value
// some code that I still want to run
}
}
Есть ли способ в Mockito, чтобы заглушить результат класса2.method? Я пытаюсь улучшить покрытие кода для класса 1, поэтому мне нужно вызвать его реальные методы производства.
Я просмотрел API Mockito по его методу spy, но это заменило бы весь метод, а не ту часть, которую я хочу.
Ответы
Ответ 1
Я думаю, что понимаю ваш вопрос. Позвольте мне перефразировать, у вас есть функция, которую вы пытаетесь протестировать, и хотите высмеять результаты функции, вызванной внутри этой функции, но в другом классе. Я обработал это следующим образом.
public MyUnitTest {
private static final MyClass2 class2 = mock(MyClass2.class);
@Begin
public void setupTests() {
when(class2.get(1000)).thenReturn(new User(1000, "John"));
when(class2.validateObject(anyObj()).thenReturn(true);
}
@Test
public void testFunctionCall() {
String out = myClass.functionCall();
assertThat(out).isEqualTo("Output");
}
}
Что это делает, так это то, что внутри функции, завернутой аннотацией @Before, я настраиваю, как я хочу, чтобы функции в классе2 отвечали заданным конкретным входам. Затем, изнутри фактического теста, я просто вызываю функцию, которую я пытаюсь протестировать в классе, который я хочу проверить. В этом случае myClass.functionCall() работает как обычно, и вы не переписываете какие-либо его методы, но вы просто высмеиваете выходы, полученные из методов (или методов) в MyClass2.
Ответ 2
Это работало для меня:
public class Class1Test {
Class1 class1;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
class1 = new Class1();
}
@Test
public void testClass1Method() {
Class2 class2 = Mockito.mock(Class2.class);
class1.setClass2(class2);
Mockito.when(
class2.class2Method(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn("some response");
String actualResponse = class1
.class1Method("12345", "3333", "4444");
assertEquals("some response", actualResponse);
}
}
Ответ 3
Я написал простой пример, который работал нормально, надеюсь, это поможет:
method1() из Class1 вызывает method2() из Class2:
public class Class1 {
private Class2 class2 = new Class2();
public int method1() {
return class2.method2();
}
}
Class2 и method2():
public class Class2 {
public int method2() {
return 5;
}
}
И тест:
import org.junit.Rule;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
public class TestClass1 {
@Mock
Class2 class2;
@InjectMocks
Class1 class1;
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Test
public void testMethod1(){
when(class2.method2()).thenReturn(29);
assertEquals(29,class1.method1());
}
}