java - 单元测试无效带有随后续操作改变状态的依赖项的方法

标签 java unit-testing junit tdd mockito

当依赖项更改传递引用的状态时,我无法对 void 方法进行单元测试并模拟依赖项。我知道可以在 void 方法上观察到副作用,也可以观察到行为,但我很难将这些准则应用于此代码。那里有类似的问题,但我找不到任何涉及后续本地状态更改的内容。我正在使用 JUnit 和 Mockito...这是我正在谈论的代码的一个人为版本:

@Mock
MergingObject mergingObject;

@Override
public void process(Foo foo1) {
    Foo foo2 = getAnInstanceOfFoo(); // private
    Foo foo3 = mergingObject.merge(foo1, foo2); // public
    foo1.copySomeValues(foo3);
}

这里的难题是我是否为 MergingObject 对象创建一个模拟。当我们模拟对象时,我期望的状态更改会消失,因为 merge(...) 操作永远不会被调用。我可以尝试验证是否使用 foo1 和 foo2 的正确实例调用了 merge(...),但后续的 copySomeValues(...) 调用仍然抛出 NullPointerException。

有什么建议吗?

最佳答案

除非我误解你的意思,否则你将 mergingObject 设置为模拟,但没有设置模拟的行为。您需要告诉模拟的 mergingObject,当调用 .merge 时,返回一些内容。这个东西可以是你喜欢的任何东西,你可以验证 process() 返回的对象是否是同一个对象。

您可以使用mockito中的 stub 语法来设置行为。我从来没有使用过mockito,但是看看这个网站,它是这样的

when(mergingObject.merge(something, somethingelse).return(new Foo());

您需要小心如何指定某些内容和其他内容的参数,以便它们与您的 foo1 和 foo2 匹配

关于java - 单元测试无效带有随后续操作改变状态的依赖项的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006282/

相关文章:

java - 如何在 Eclipse 调试中添加 JAVA 命令行参数

java - JPA - 没有关系的持久实体

asp.net-mvc - MVC + EF DB-First 单元测试

entity-framework - 使用 EF Code First DataContext 进行单元测试

java - 如何使用JUnit测试Spring Boot中的服务层代码?

java - 我对 java.util.Scanner 做错了什么?

java - 使用 getText 时变量具有空值,但渲染单选按钮时变量不具有空值

c# - 在操作内部分配响应属性时对 Controller 操作进行单元测试

java - 如何对两种不同的文件格式运行单元测试?

java - JUnit UnsatisfiedLinkError : android. util.Log.isLoggable(Ljava/lang/String;