У меня есть метод, который использует окончательные аргументы String в ServiceClassA.
@Service
public class ServiceClassA {
public String callingMethod(final String argOne, final String argTwo) {
//Implementation here
}
}
И его вызов внутри другого метода в другом классе ServiceClassB.
@Service
public class ServiceClassB {
private final ServiceClassA serviceClassA;
public MyResponse methodB() {
String inputOne = "111";
String inputTwo = MyEnum.AAA.getDescription();
final String result = serviceClassA.callingMethod(inputOne,inputTwo);
//some implementations
MyResponse response = new MyResponse();
//set values to response
return response;
}
}
Также есть перечисление.
public enum MyEnum {
AAA(1, "AAA"), BBB(2,"BBB");
private static final Map<Integer, MyEnum> MYENUM_MAP = new HashMap<>();
static {
for (MyEnum myEnum : values()) {
MYENUM_MAP.put(myEnum.getValue(), myEnum);
}
}
private final int value;
private final String description;
private MyEnum(int value, String description) {
this.value = value;
this.description = description;
}
public String getDescription() {
return description;
}
public int getValue() {
return value;
}
}
Я тестирую ServiceClassB, используя mockito и JUnit. Когда я пытаюсь издеваться над callMethod в ServiceClassA, он возвращает null вместо «SUCCESS».
@RunWith(MockitoJUnitRunner.class)
public class ServiceClassBTest {
@InjectMocks
private ServiceClassB serviceClassB;
@Mock
private ServiceClassA serviceClassA;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void methodB_success(){
String result = "SUCCESS";
when(serviceClassA.callingMethod(Mockito.anyString(), Mockito.anyString())).thenReturn(result);
}
}
Я попробовал несколько способов, как показано ниже, и всегда возвращает ноль. Но я хочу получить УСПЕХ в результате.
when(myService.callingMethod(Mockito.anyString(), Mockito.anyString())).thenReturn(result); //return null
when(myService.callingMethod(Mockito.any(), Mockito.any())).thenReturn(result); //return null
when(myService.callingMethod(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(result); //return null
doReturn(result).when(myService).callingMethod(Mockito.anyString(), Mockito.anyString()); //return null
Я использовал @InjectMocks в myTestClass
Я думаю, что было бы легче помочь, если бы вы предоставили нам дополнительную информацию.
в порядке. Я изменю вопрос с более подробной информацией.
Добавил больше деталей в вопрос и надеюсь, что это будет полезно.
Показать все ServiceClassB; в частности, как вы устанавливаете serviceClassA. Код, который вы включили, не может ни запускаться, ни компилироваться; финал никогда не инициализируется.
@InjectMocks — это не волшебство. Поскольку член serviceClassA класса ServiceClassB не помечен ни как Autowired, ни как Inject, он всегда будет игнорироваться InjectMocks. Попробуйте прочитать javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/…
Проблема в том, что вы используете @RunWith(MockitoJUnitRunner.класс) вместе с MockitoAnnotations.initMocks(это). Они конфликтуют.
Используйте что-то одно MockitoJUnitRunner
или MockitoAnnotations.initMocks
.
MockitoJUnitRunner Initializes mocks annotated with Mock, so that explicit usage of MockitoAnnotations.initMocks(Object) is not necessary. Mocks are initialized before each test method.
Рабочий тест:
@RunWith(MockitoJUnitRunner.class)
public class ServiceClassBTest {
@InjectMocks
private ServiceClassB serviceClassB;
@Mock
private ServiceClassA serviceClassA;
@Test
public void methodB_success(){
String result = "SUCCESS";
when(serviceClassA.callingMethod(Mockito.anyString(), Mockito.anyString())).thenReturn(result);
serviceClassB.methodB();
}
}
Разве вы не внедряете макет в класс, который вы на самом деле тестируете?