JUnit断言强制执行一行

时间:2015-04-30 09:36:19

标签: java unit-testing junit mockito

是否有任何junit断言,我可以强制执行一行?

例如:

doAnswer(new Answer<Void>() {
    @SuppressWarnings("unchecked")
    @Override
    public Void answer(final InvocationOnMock invocation) throws Throwable {
        Object[] arguments = invocation.getArguments();
        Map<String, String> fieldMapActual = (Map<String, String>) arguments[0];
        assertEquals(fieldMap, fieldMapActual);

        **assertFailIfThisLineIsNotExecuted();**

        return null;
    }
}).when(x).myMethod(xxx);

当我模拟myMethod的行为时,如果myMethod将使用预期的值/参数调用,那么匿名内部类型的方法回答将在myMethod的运行时执行(而不是在junit test的运行时)。 为了断言调用该方法,我必须另外定义一个验证(否则即使没有调用该方法,我的测试仍然会运行)。

verify(x).myMethod(xxx); 

如果我有机会在答案方法中写出 assertFailIfThisLineIsNotExecuted ,我就不必定义额外的验证。再说一次,是否有任何junit断言,我可以强制执行一行?相反,失败()可以说,没有立即将方法定义为&#34;成功&#34;。

1 个答案:

答案 0 :(得分:1)

如果要确保正在执行测试的某一行,请使用布尔标志:

 final boolean[] wasExecuted = { false };

 ...
     wasExecuted[0] = true;
 ...

 assertTrue("Some code wasn't executed", wasExecuted);

但我的直觉是,你正试图解决另一个问题。

verify说“必须调用此方法”。你是否嘲笑答案并不重要。所以这是你应该使用的方法。

只有当我因某些原因无法创建模拟时,才会使用我的标记方法。如果发生这种情况,我会在测试代码中扩展测试中的类并添加标志。

标志优于verify的优点是我期望代码所在的标志文档(您可以让IDE搜索所有使用该标志的位置)。 <{1}}在失败时并不容易找到。

verify()应该是你想要的。它也表达了意图。

verify(x).myMethod(xxx);也只是一行代码(那么它如何比assertFailIfThisLineIsNotExecuted()“更好”?),JUnit不支持它,你必须编写代码来获得一个好的错误信息等。