我在 Mockito 1.9.5 中使用注释 @Mock(answer=Answers.RETURNS_SMART_NULL)
以便在发生某些意外的模拟调用时获得一些 SmartNullPointerException。
不幸的是,测试通过了,即使没有模拟至少一个重要的调用。
明确:我的意思是不是自己找到我遗漏的东西,而是未通过测试因为> 我没有 mock 这些方法。我想在不使用 Mockito.verifyNoMoreInteractions(...)
我的测试:
@RunWith(MockitoJUnitRunner.class)
public class ContextServiceImplTest {
@Mock(answer = Answers.RETURNS_SMART_NULLS)
private IAccountDAO accountDaoMock;
@Mock(answer = Answers.RETURNS_SMART_NULLS)
private IRuleService ruleServiceMock;
@Mock(answer = Answers.RETURNS_SMART_NULLS)
private ISensorDAO sensorDAOMock;
private ContextServiceImpl contextService;
@Before
public void before() {
contextService = new ContextServiceImpl(accountDaoMock, ruleServiceMock, sensorDAOMock);
}
@Test
public void fillSensor() throws Exception {
// given
String givenSensorId = "123"
final EventDTO givenEvent = new EventDTO();
givenEvent.setSensorId(givenSensorId)
// when
final Context context = contextService.getContext(givenEvent);
// then (should fail and throw explicit exception
}
待测代码:
public class ContextServiceImpl {
...
public Context getContext(final EventDTO event) throws Exception {
final String sMethodName = "getContext";
final String sensorId = event.getSensorId();
Context context = new Context();
try {
final Sensor sensor = sensorDAO.findById(sensorId);
context.setSensor(sensor);
return context;
} catch (final NoResultException nre) {
throw new BusinessException(ValidationCode.UNSUPPORTED_VALUE, "sensorId");
} catch (final PersistenceException pe) {
throw new TechnicalException(TechnicalCode.DATABASE_ACCESS_PROBLEM);
}
}
感谢您的评论/建议/解释。
最佳答案
您需要在 null
对象 sensor
上调用方法才能使测试失败。
您似乎从未使用过null
对象sensor
。
这意味着你不会得到任何 NullPointerExceptions
(聪明与否)
你可以做一个
AssertEquals(context.getSensor().someMethod(), expectedResult);
或者只是一个
context.getSensor().someMethod();
获取异常。 但是
AssertNotNull(context.getSensor());
不足以获得 SmartNullPointerException
关于java - Mockito RETURNS_SMART_NULLS 回答奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30918506/