我想用 spock 測驗這個方法
public class MainService {
private final DLCRDDLPortType dlcrddlPortType;
public void startProcess(Application app) {
Holder<String> status = new Holder<>();
Holder<String> statusText = new Holder<>();
dlcrddlPortType.startProcess(app.getApplicationId(), status, statusText);
if (status.value.equals(FAIL_RESPONSE_STATUS)) {
throw new FailResponseException(String.format("Failed to get response with status %s and description %s", status.value, statusText.value));
}}
public final class Holder<T> implements Serializable {
public T value;
public Holder() {
}
public Holder(T value) {
this.value = value;
}
}
status.value為空,沒有 setter 我不能改變它,我不能用建構式創建它,因為我需要模擬。我該如何解決?
錯誤: 無法呼叫“String.equals(Object)”,因為“status.value”為空
我的測驗:
private DLCRDDLPortType dlcrddlPortType
private MainService mainService
private Holder status
private Holder statusText
void setup() {
status = GroovyMock()
dlcrddlPortType = Mock()
mainService= new MainService(dlcrddlPortType)
}
def "startProcess success"() {
given:
def appId = 171l
ReflectionTestUtils.setField(status, "value", "SUCCESS")
def app = Application.builder().applicationId(appId).build()
when:
mainService.startProcess(app)
then:
1 * dlcrddlPortType.startProcess(appId, status, statusText)
}
uj5u.com熱心網友回復:
我試圖從你的部分示例中創建一個MCVE。重要的部分是這樣的:
1 * dlcrddlPortType.startProcess(appId, _, _) >> { id, status, statusText ->
status.value = "SUCCESS"
}
有了這個,您可以使用回應生成器來訪問引數,并將值設定為狀態持有者。
這是稍微調整的示例:
public class MainService {
private DLCRDDLPortType dlcrddlPortType;
public void startProcess(Application app) {
Holder<String> status = new Holder<>();
Holder<String> statusText = new Holder<>();
dlcrddlPortType.startProcess(app.getApplicationId(), status, statusText);
if (status.value.equals("FAIL_RESPONSE_STATUS")) {
throw new IllegalStateException(String.format("Failed to get response with status %s and description %s", status.value, statusText.value));
}
}
}
class Application {
long applicationId
}
interface DLCRDDLPortType {
void startProcess(long applicationId, Holder<String> status, Holder<String> statusText)
}
public final class Holder<T> implements Serializable {
public T value;
public Holder() {
}
public Holder(T value) {
this.value = value;
}
public void setValue(T value) {
this.value = value;
}
}
class ASpec extends Specification {
def "startProcess success"() {
given:
DLCRDDLPortType dlcrddlPortType = Mock()
MainService mainService = new MainService(dlcrddlPortType: dlcrddlPortType)
long appId = 171l
def app = new Application(applicationId: appId)
when:
mainService.startProcess(app)
then:
1 * dlcrddlPortType.startProcess(appId, _, _) >> { id, status, statusText ->
status.value = "SUCCESS"
}
}
}
在Groovy 控制臺中嘗試
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/394621.html
