java - Mockito RETURNS_SMART_NULLS 回答奇怪的行为

标签 java mockito method-invocation

我在 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/

相关文章:

java - 代码简化和串联

java - JdbcTemplate 类型中的方法 query(String, ResultSetExtractor<T>) 不适用于参数 (String, BeanPropertyRowMapper)

java - 如何使用用户给出的参数调用静态方法(反射)

java - 作业问题OCJP;为什么我不能将 int 传递给 short?

java - 自动关闭并抛出异常

java - 如何使用科学记数法存储数字?

java - 如何使用调度程序触发 Spring Quartz 触发器

java - 在java中获取无效游标状态异常

java - Junit 在等待并处理异常后断言某些内容

java - 如何验证使用给定接口(interface)的任何子类型的实例调用的方法