gpt4 book ai didi

java - 如何对副作用逻辑进行单元测试

转载 作者:行者123 更新时间:2023-12-01 10:37:36 25 4
gpt4 key购买 nike

我有以下代码

public class Component extend Framework {
private Integer someInt;
private String someString;
public Integer getSomeInt() {
return someInt;
}
public String getSomeString() {
return someString;
}
public void activate() {
Integer tempInt = (Integer)getProperties("key"); // From Framework
if (tempInt == null) {
tempInt = (Integer)getRequest().getProperties("key"); // From Framework
}

if(tempInt == null)
tempInt = (Integer)getBind().getProperties("key"); // From Frameowrk
someString = makeServiceCall("http://.....?key=tempInt");
}
}

基本上,activate() 方法由框架调用,以便访问框架的内部状态来构造 Component 对象。 activate() 有点像 Component 对象的 setter。如果我要对上面的代码进行单元测试,那么在不需要运行框架的情况下执行此操作的最佳方法是什么?

一种方法是模拟 Component 类并 stub super.getProperties... 调用,但是如果我们模拟有问题的类,那么开始测试的意义何在?

最佳答案

我将展示如何测试一种边缘情况

void testServiceCallWithNoKeyPropertyFound() {
Component componentUnderTest = new Component() {
Integer getProperties(String key) {
return null; // property should not be found
}

Request getRequest() {
return new Request(...); //this request should not contain a property named "key",
}

Bind getBind() {
return new Bind(...); //this bind should not contain a property named "key"
}

String makeServiceCall(String url) {
if (url.endsWith("null")) {
return success;
}
throw new AssertionError("expected url ending with null, but was " + url);
}

};
componentUnderTest.activate();
assertThat(componentUnderTest.getSomeString(), equalTo("success"));
}

使用Mockito(spys)可以使这个例子更加简洁。但这会隐藏如何设计测试的原则。

还有一些边缘情况:

void testServiceCallWithPropertyFoundInComponent() ...
void testServiceCallWithPropertyFoundInRequest() ...
void testServiceCallWithPropertyFoundInBind() ...

关于java - 如何对副作用逻辑进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34579729/

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