gpt4 book ai didi

java - 对象模拟不起作用(其 null)并在方法调用时返回 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 17:50:16 25 4
gpt4 key购买 nike

这是我正在测试的 A 类 -

class A extends ServerResource {
@Override
protected void doInit() throws ResourceException {
}

@Get
public String getUsers() {
String userJson = null;
// want to mock
UserFacade userFacade = new UserFacade();
// database call: want to return resources
List<Resource> resources = userFacade.getDrUsersByExample();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
userJson = gson.toJson(resources);
return userJson ;
}

}

这是测试类 -

@RunWith(MockitoJUnitRunner.class)
class ATest {
@Mock
UserFacade userFacade;

List<Resource> resources;

@Before
public void setUp() throws Exception {
Resource resource = new Resource();
resource.setName("user");
resource.setTask("manual");
resources.add(resource);
}

@Test
public void testUsers() {
when(userFacade.getDrUsersByExample()).thenReturn(resources);

A a = new A();

// causes NullPointerException for userFacade.getDrUsersByExample()
String userList = a.getUsers();
}

}

为什么即使在使用 when(userFacade.getDrUsersByExample()).thenReturn(resources) 之后,我仍会收到模拟对象的 NullPointerException ?

最佳答案

模拟的UserFacade需要显式注入(inject)到被测试的主题中。 A 目前与该依赖项紧密耦合,因为该方法内部有 new UserFacade()

紧耦合被认为是代码异味和糟糕的设计。重构类以遵循显式依赖原则。

class A extends ServerResource {
UserFacade userFacade;

public A(UserFacade userFacade) {
this.userFacade = userFacade;
}

@Override
protected void doInit() throws ResourceException {
}

@Get
public String getUsers() {
String userJson = null;
// database call: want to return resources
List<Resource> resources = userFacade.getDrUsersByExample();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
userJson = gson.toJson(resources);
return userJson ;
}
}

然后需要更新测试才能完成。

@Test
public void testUsers() {
//Arrange
when(userFacade.getDrUsersByExample()).thenReturn(resources);

A a = new A(userFacade);

//Act
String userList = a.getUsers();

//Assert
//...
}

关于java - 对象模拟不起作用(其 null)并在方法调用时返回 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50985282/

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