我正在使用 Mockito 为我的服务器编写测试。在我的测试中,它使用的是模拟 Messenger,而不是真正的 Messenger(它会尝试向客户端发送实际的 HTTP 消息)。我面临的问题是,服务器方法之一基本上是这样做的(在服务器创建的线程中,而不是测试线程中):
void serverMethod() {
MyObject object;
object.setProperty(1);
messenger.send(object);
object.setProperty(2);
}
在我的测试中,我试图验证它在传递给时object.getProperty()
会返回 1 ,而不是 2。我已经尝试了自定义参数匹配器和参数捕获器,并且实际上都通过了一些时间,但他们没有t 可靠地通过,因为测试线程正在与即将修改“对象”的服务器线程竞争,因此返回 2。messenger.send()
object.getProperty()
我已经验证了应用程序代码没有实际的错误,因为真正的 Messenger 会立即序列化“对象”以发送给客户端,有效地复制“属性”的值,因此以后的任何修改都无关紧要。
我很清楚这可能是其中一种情况,尽管应用程序代码运行良好,但它的可测试性很差,因此为此编写良好的确定性测试(不改变整个测试基础设施)的唯一方法是修改应用程序代码以提高可测试性(在这种情况下,传递一个不可变对象而不是即将修改和重用的可变对象)。
我的问题是,有没有什么聪明的方法可以在不接触应用程序代码的情况下正确测试它?