3

我将注释@Mock(answer=Answers.RETURNS_SMART_NULL)与 Mockito 1.9.5 一起使用,以便在发生一些意外的模拟调用时获得一些 SmartNullPointerException。

不幸的是,测试通过了,即使没有嘲笑至少一个重要的电话。 明确一点:我的意思不是自己找到我缺少的东西,而是因为我没有模拟这些方法而未能通过测试。我想在不使用的情况下做到这一点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);
    }
}

感谢您的意见/建议/解释。

4

2 回答 2

1

您需要在null对象上调用一个方法sensor才能使测试失败。

似乎您从未使用过nullobject sensor。这意味着你不会得到任何NullPointerExceptions(聪明与否)

你可以做一个

AssertEquals(context.getSensor().someMethod(), expectedResult);

或者只是一个

context.getSensor().someMethod();

得到一个例外。

AssertNotNull(context.getSensor());

不足以获得SmartNullPointerException

于 2015-06-18T14:47:51.710 回答
1

您的测试仍然会通过,因为您没有使用任何这些模拟调用的结果调用任何内容。

RETURNS_SMART_NULLSSmartNullPointerException仅当您尝试取消引用a 时才抛出a SmartNull。从本质上讲,它告诉您您正在null以更友好的方式取消引用一个值,而您并没有使用当前代码这样做。

首先 - 你新了一个Context. 除非您陷入线程问题的杂草中,否则它将永远不会回来null

接下来 - 你传入一个 newed EventDTO。由于上述相同的原因,那也不会null

sensor may be的结果null,但没关系 - 您只是将它传递给 thecontext而不对其调用任何逻辑。

我不相信这RETURNS_SMART_NULLS会最适合您的方案。我建议您从模拟对象中删除这些答案。这将导致您的测试失败,因为您没有预料到任何这些交互。

于 2015-06-18T15:31:19.470 回答