Насмешливый метод с окончательными аргументами

У меня есть метод, который использует окончательные аргументы 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

Разве вы не внедряете макет в класс, который вы на самом деле тестируете?

bob 04.05.2022 14:42

Я использовал @InjectMocks в myTestClass

Dinushika Rathnayake 04.05.2022 14:46

Я думаю, что было бы легче помочь, если бы вы предоставили нам дополнительную информацию.

bob 04.05.2022 14:48

в порядке. Я изменю вопрос с более подробной информацией.

Dinushika Rathnayake 04.05.2022 14:52

Добавил больше деталей в вопрос и надеюсь, что это будет полезно.

Dinushika Rathnayake 04.05.2022 15:22

Показать все ServiceClassB; в частности, как вы устанавливаете serviceClassA. Код, который вы включили, не может ни запускаться, ни компилироваться; финал никогда не инициализируется.

DwB 04.05.2022 17:25

@InjectMocks — это не волшебство. Поскольку член serviceClassA класса ServiceClassB не помечен ни как Autowired, ни как Inject, он всегда будет игнорироваться InjectMocks. Попробуйте прочитать javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/…

DwB 04.05.2022 17:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы используете @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();
    }
}

Другие вопросы по теме