嘲笑部分测试

时间:2013-12-07 09:36:01

标签: java unit-testing mocking mockito

我正在测试一个方法,如果传递给方法的参数高于某个业务规则限制,它几乎会立即抛出异常。

我测试的类有依赖项,所以我嘲笑它们。但是,由于异常将几乎立即抛出,我允许(是否正确)只模拟我需要的东西?或者我需要指定整个测试吗?

我希望抛出异常,所以我需要模拟所有对象并设置返回值等吗?

在这些情况下,什么是正确的?在同一个测试中同时执行验证和断言是不对的?

2 个答案:

答案 0 :(得分:0)

如果您可以拥有一些代码示例,那就太棒了。但是,正如我所理解的那样,你是Unit Testing方法,它会在检查某种业务规则后立即抛出异常。您还具有注入此类的依赖项(SUT - 受测系统)。这些依赖项在单元测试中被模拟/存根,但由于异常被立即抛出,你不确定是否嘲笑一切都是好主意。

通常情况下,对于任何单元测试,您希望绝对确保您的单元测试仅包含它所需的内容,而不是其他内容。如果你在单元测试中嘲弄存根,并且在你的SUT中测试执行期间没有使用它们,那么

一个。您的测试可能更难以维护,并且更难以阅读,因为可能不容易弄清楚测试实际使用的是什么以及测试实际上在做什么。

湾您的测试可能因错误的原因而失败。例如,您的SUT完全按照您期望的方式工作,但由于不需要的依赖项被嘲笑,任何重构都会因为错误的原因而导致测试失败。这也称为false positive测试。

您应该尝试实现的是编写单独的单元测试来验证异常情况。此测试只会注入依赖项以使您的规则违反,因此您可以测试异常场景。所有其他测试都会注入依赖项,以使这些测试尽可能满足。

答案 1 :(得分:0)

我想这个问题没有最终的答案,但正如我在Spocks回答的评论中所说,我所做的总是提供所测试的课程所需的所有依赖关系,无论特定的测试是否会使用是不是。这就是我这样做的原因:

基本上,实现可能会改变,但如果满足预期的行为,我的测试仍然应该通过。注意,不使用依赖关系可能是明确的预期行为。在这种情况下,我认为可以省略。

至少在你编写测试时使用TDD(你应该先编写测试的地方)时,你不知道什么时候会抛出异常。除非你没有明确的行为要求,否则从测试的角度来看,这应该是完全透明的。