2016-06-18 2 views
0

Я хотел бы использовать Mockito для тестирования EJB. Метод get() возвращает результат запроса базы данных, а transformedGet() выполняет бизнес-логику в сеансовом компоненте.Метод mocked возвращает null вместо ожидаемого

Если вы вызываете mockFoo.get(), он работает должным образом. Но когда mockFoo.transformedGet() вызывает метод get(), он возвращает с нулевым значением вместо ожидаемого значения.

Я хотел бы протестировать бизнес-логику и изолировать запрос базы данных. Можно ли это сделать с Mockito?

Класс для проверки:

public class Foo { 
    public String get() { 
     return "get"; 
    } 

    public String transformedGet() { 
     return "transformed" + get(); 
    } 
} 

Тест:

@Test 
public void mockitoTest() { 
    Foo mockFoo = Mockito.mock(Foo.class); 
    String expected = "test"; 

    Mockito.when(mockFoo.get()).thenReturn(expected); 

    String actual = mockFoo.get(); 
    Assert.assertEquals(actual, expected); 
    String transformed = mockFoo.transformedGet(); 
    Assert.assertEquals(transformed, "transformed" + expected); 
} 

ответ

0

Вы насмехаясь класс под испытанием. Все методы издеваются, включив transformGet(), который по умолчанию возвращает null, так как вы не сказали Mockito, что он должен вернуть.

Лучшей практикой было бы получить get() в отдельном классе, введенном в тестируемый класс. Ваш тест будет издеваться над этой вложенной зависимостью, а не с тестируемым классом.

Вы также можете использовать spy или partial mock, как описано в документации, но это не идеально.