java - 你会像 "inherit and override"一样模拟被测试的类吗?

标签 java unit-testing mocking mockito

当我使用mockito框架时,我通常只模拟被测类(CUT)的协作者。

但是,我有时在“有效处理遗留代码”中看到了一种编写 UT 的方法。

一种方法中有太多逻辑。

你会:

1)将一些逻辑代码提取到单独的方法

2)继承CUT并重写此方法

3)如果我们不想运行此代码(它与我们的测试不太相关),请模拟此方法

然后我想我从来没有在我的 CUT 中 mock 过方法,只有合作者。

你会模拟 CUT 的方法吗?

你会如何同时模拟 CUT 的方法和 CUT 的合作者?

最佳答案

是的,有时这确实是一件有用的事情。 Mockito 有 spy ,允许模拟现有对象的某些方法。例如:

public class Foo {
    public int bar() {
        return baz() * 2;
    }
    protected int baz() {
        // some computation you want to mock
    }
}

您可以这样编写 bar() 测试:

// given
Foo foo = new Foo();
Foo spy = spy(foo);
doReturn(5).when(spy).baz();

// when
int result = spy.bar();

// then
assertEquals(10, result);

Mockito 也有部分模拟。一切都在 Mockito javadoc 中描述。 .

执行上述操作以及模拟协作者只需将模拟的协作者传递给被测试的对象:

Collaborator mockCollaborator = mock(Collaborator.class);
Foo foo = new Foo(mockCollaborator);
Foo spy = spy(foo);
...

关于java - 你会像 "inherit and override"一样模拟被测试的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26489540/

相关文章:

java - 第二个 Activity Java 代码有什么问题?

c# - MvcBuildViews 与 Razor 生成器

unit-testing - 报告单元测试结果

java - 如何使用 final 方法模拟一个类?

javascript - 如何模拟在不同组件中调用具有不同返回值的同一函数

java - 如何避免使用反射来创建新实例

java - 3D 体素角度平面

java - Hibernate 过滤器关联

perl - 如何伪造 Perl 钻石运算符的输入?

TDD、Mocking、依赖注入(inject)和 DRY 原则