gpt4 book ai didi

java - 重构以编写 "pretty"JUnit 测试

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:31:32 24 4
gpt4 key购买 nike

我想阐明 TDD 范围内的重构。

之前:

class Somclass{
public void sendMessage(){
WebServiceStub stub = new WebServiceStub();
...
stub.sendMsg();
}
}

之后:

class Somclass{
private WebServiceStub stub;

public void sendMessage(){
...
if(stub == null){
stub = new WebServiceStub();
}
...
stub.sendMsg();
}
}

所以我想验证 sendMsg() 方法并对结果进行一些断言。为了能够模拟这个 stub ,我将这个 stub 局部变量移动到实例变量。这样我就可以将模拟 stub 设置为类并在测试类中进行验证和断言。例如:

@Test
public void testSMth(){
wsProvider.setStub(stubMock);
verify(stubMock).sendMsg();
...asserts
}

这种方法不是线程安全的,我应该做一些并发修改。这种修改可能会导致错误。所以在局部变量 approce 中有线程安全。

我还可以创建将返回 WebServiceStub 实例的工厂。但是这种方法会产生新的类,因为这种情况很常见。

有个问题:这个case怎么测试,goot测试成本修改会不会出错?

最佳答案

你的类应该有 WebService 对象(我拒绝称它为“ stub ”)作为一个字段。

class Someclass{

@Resource
private WebService ws;

public void sendMessage(){

ws.sendMsg();
}
}

它应该注入(inject)您选择的 DI 框架。在您的测试中,您可以将其设置为模拟。不需要惰性 setter/getter ,因为您指出这不是线程安全的。

关于java - 重构以编写 "pretty"JUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com