所以我开始为我们的 Java-Spring-project 编写测试。
我使用的是 JUnit 和 Mockito。据说,当我使用 when()…thenReturn() 选项时,我可以模拟服务,而无需模拟它们左右。所以我想做的是,设置:
when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)
但无论我执行哪个 when 子句,我总是会得到一个 NullpointerException,这当然是有道理的,因为输入为空。
此外,当我尝试从对象模拟另一种方法时:
when(object.method()).thenReturn(true)
在那里我还得到了一个 Nullpointer,因为该方法需要一个未设置的变量。
但我想使用 when()..thenReturn() 来绕过创建这个变量等等。我只是想确保,如果任何类调用此方法,那么无论如何,只返回 true 或上面的列表。
这基本上是我的误解,还是有其他问题?
代码:
public class classIWantToTest implements classIWantToTestFacade{
@Autowired
private SomeService myService;
@Override
public Optional<OutputData> getInformations(final InputData inputData) {
final Optional<OutputData> data = myService.getListWithData(inputData);
if (data.isPresent()) {
final List<ItemData> allData = data.get().getItemDatas();
//do something with the data and allData
return data;
}
return Optional.absent();
}
}
这是我的测试课:
public class Test {
private InputData inputdata;
private ClassUnderTest classUnderTest;
final List<ItemData> allData = new ArrayList<ItemData>();
@Mock
private DeliveryItemData item1;
@Mock
private DeliveryItemData item2;
@Mock
private SomeService myService;
@Before
public void setUp() throws Exception {
classUnderTest = new ClassUnderTest();
myService = mock(myService.class);
classUnderTest.setService(myService);
item1 = mock(DeliveryItemData.class);
item2 = mock(DeliveryItemData.class);
}
@Test
public void test_sort() {
createData();
when(myService.getListWithData(inputdata).get().getItemDatas());
when(item1.hasSomething()).thenReturn(true);
when(item2.hasSomething()).thenReturn(false);
}
public void createData() {
item1.setSomeValue("val");
item2.setSomeOtherValue("test");
item2.setSomeValue("val");
item2.setSomeOtherValue("value");
allData.add(item1);
allData.add(item2);
}
原文由 user5417542 发布,翻译遵循 CC BY-SA 4.0 许可协议
您尚未存根的方法的默认返回值是
false
对于布尔方法,一个空的集合或映射对于返回集合或映射的方法和null
否则。这也适用于
when(...)
中的方法调用。在您的示例when(myService.getListWithData(inputData).get())
将导致 NullPointerException 因为myService.getListWithData(inputData)
是null
- 它之前没有被存根。一种选择是为所有中间返回值创建模拟,并在使用前存根它们。例如:
或者,您可以在创建模拟时指定不同的默认答案,以使方法返回新模拟而不是 null:
RETURNS_DEEP_STUBS
您应该阅读 Mockito.RETURNS_DEEP_STUBS 的 Javadoc,其中更详细地解释了这一点,并且对其用法也有一些警告。
我希望这有帮助。请注意,您的示例代码似乎有更多问题,例如缺少断言或验证语句以及在模拟上调用设置器(这没有任何效果)。