我是JUnit和Mockito的新手,并且正在努力尝试模拟从布尔方法返回的值以命中条件。
我已经尝试了这篇文章的答案,但似乎不适用于此。我尝试过使用间谍,然后CallRealmethod,无法弄清楚。
我已经测试了值何时为真,但我似乎无法进入else部分进行测试。
这里有一个我所做的例子:
ServiceImpl.java有一个调用boolean方法的寄存器()方法,该方法简单地检查另一个服务的布尔值是true还是false,然后返回该值。
如果为true,它会构建一个JsonNode有效负载来发送,否则,如果为false,它会从有效负载中删除一个字段。
// ServiceImpl.java:
// in the record() method:
if (body.has("fieldtoBeRemoved")) {
if (shouldRegister()) {
((ObjectNode) body).set("fieldtoBeRemoved");
} else {
// this is the line I am trying to test
((ObjectNode) body).remove("fieldtoBeRemoved");
}
}
// method being called above in the conditional
protected boolean shouldRegister() {
Optional<String> flag = configService.getString("booleanValue");
String stringFlag = flag.orElse("false");
return BooleanUtils.toBoolean(stringFlag);
}
// In the test
@InjectMocks
private ServiceImpl serviceImpl;
@Test
public void testingForFalse() {
serviceImpl = new ServiceImpl();
// what I am struggling with, trying to make the value false,
// so that it hits the else in the record() method in ServiceImpl
// and removes fieldtoBeRemoved from the payload
when(serviceImpl.shouldRegister()).thenCallRealMethod();
doReturn(false).when(spy(serviceImpl)).shouldRegister();
assertThat(fieldtoBeRemoved, is(""));
}
当我运行它时,它失败了,因为field dtoBeRemove的值不为空,它具有有效负载中字段的值,而它不应该具有。我猜该值仍然返回为true,因为我没有正确地模拟它/在此测试用例中将其设置为false。我还尝试模拟对记录()方法的调用。感谢任何帮助!
如果源代码和测试在同一个包中,并且应该至少在package-privacy中注册
,您可以执行这样的操作
@Test
public void testingForFalse() {
serviceImpl = new ServiceImpl() {
@Override
public boolean shouldRegister() {
return false;
}
}
// rest of the test
}
在这种情况下,您不需要对此方法进行任何模拟。