我目前正在尝试完成一项测试驱动开发课程,并遇到以下代码的问题:
package stockInformation;
public class StockInformation {
String companyName;
public String getCompanyName() {
return companyName;
}
private WebService webService;
// Constructor
public StockInformation(int userID) {
if (webService.authenticate(userID)){
//Do nothing
} else {
companyName = "Not Allowed";
}
}
}
(if-else的目的很糟糕,以便我可以在作业中稍后重构)
由另一个团队开发的Web服务'所以需要嘲笑 包stockInformation;
public interface WebService {
public boolean authenticate(int userID);
}
测试类
package stockInformation;
import org.junit.Before;
import org.junit.Test;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
public class StockInformationTest {
WebService mockWebService;
StockInformation si;
@Before
public void setUp() throws Exception {
mockWebService = createMock(WebService.class);
}
@Test
public void testUserIdAuthentication() {
int userID = -2;
si = new StockInformation(userID);
expect(mockWebService.authenticate(userID)).andReturn(false);
replay(mockWebService);
assertEquals("Not Allowed", si.getCompanyName());
verify(mockWebService);
}
}
当我运行单元测试时,我得到一个NullPonterException:
if (webService.authenticate(userID)){
和
si = new StockInformation(userID);
我希望单元测试通过:) 任何帮助表示赞赏。
答案 0 :(得分:0)
您从未在班级private WebService webservice
中设置StockInformation
。您在StockInformation
构造函数中使用它,其值为null。
答案 1 :(得分:0)
你应该以某种方式为StockInformation类的webService字段赋值。
这可以通过反射或setter方法完成:
public void setWebService(WebService webService) {
this.webService = webService;
}
然后在测试执行期间,将模拟WebService实例设置为StockInformation实例:
si = new StockInformation(userID);
si.setWebService(mockWebService);