单元测试空指针异常

时间:2016-02-05 12:39:27

标签: unit-testing tdd easymock

我目前正在尝试完成一项测试驱动开发课程,并遇到以下代码的问题:

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);

我希望单元测试通过:) 任何帮助表示赞赏。

2 个答案:

答案 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);