Тестирование функции, имеющей несколько классов с автопроводкой, с использованием Mockito - PullRequest
0 голосов
/ 12 февраля 2019

Здесь я хочу проверить method1.Я хотел реализовать это, используя аннотации @Mock и @InjectMocks, но используя class B в качестве макета, он возвращает NPE.

 class A {
     @Autowired
     private B b;

     public String method1()
       {
         return b.method2(); 
       }
     }

class B{
     @Autowired
     private C c;

    public String method2(){
       return C.method3();
     }
    }

Класс теста:

@InjectMocks
    A a;

    @Mock
    B b = new B();


    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMethod1() {

    String x=a.method1();
    assertEquals("value",x);
    }

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Чтобы вызвать C реальный метод, используйте @ Spy в тестовом классе

@Spy
@Autowired
private C c;

Обратите внимание, что @InjectMocks также можно использовать в сочетании с аннотацией @Spy,это означает, что Mockito будет вводить макеты в тестируемый частичный макет.

Также обратите внимание на предупреждение об использовании MockitoAnnotations.initMocks(this) с @Spy:

если вы вызываете MockitoAnnotations.initMocks (this) в конструкторе суперкласса, это не будет работать.Это потому, что поля в подклассе создаются только после того, как конструктор суперкласса вернулсяЛучше использовать @Before.Вместо этого вы также можете поместить initMocks () в ваш бегунок JUnit (@RunWith) или использовать встроенный MockitoJUnitRunner .

0 голосов
/ 12 февраля 2019

При использовании аннотации @Mock не создавайте экземпляр переменной вручную.

Mockito сделает это за вас, в противном случае вы получите обычный экземпляр вместо макета:

@Mock
B b;

Также убедитесь, что вы каким-то образом настраиваете себя, чтобы ожидать определенного значения:

doReturn(returnString).when(b).method2();
...