gpt4 book ai didi

java - 如何模拟一个类,其对象在另一个类的类级别创建

转载 作者:行者123 更新时间:2023-12-01 09:27:38 25 4
gpt4 key购买 nike

例如,我有一个这样的类(class):

class Ex1{
Ex2 e = new Ex2();
Ex1(){
System.out.println("COnstructor of Ex1");
}
public int m1(){
int i = e.test();
return i;
}
}

class Ex2{
Ex2(){
//some code here, I dont want to execute this code
}
public int test(){
return 5;
}
}

我正在为Ex1类编写测试类,这里我必须模拟Ex2类

测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Ex1.class,Ex2.class})
class Ex1Test{

private static Ex1 ex;
private static Ex2 e;
@BeforeClass
public static void start(){
e = mock(Ex2.class);
PowerMock.whenNew(Ex2.class).withNoArguments().thenReturn(e);
ex1 = new Ex1();
}

但它不是模拟 Ex2 class 对象,它直接创建......

最佳答案

您的问题是您创建了难以测试代码。

是的,可以使用 Powermock 来“解决”这个问题。但事实是:您仍然创建了紧密耦合、难以测试的生产代码。简单的答案是:当您必须“控制”对象时,您只需不要直接在生产代码中调用new

有两种方法可以防止这种情况发生:

  1. 您可以使用依赖注入(inject)来简单地为您的生产代码提供这样的对象
  2. 您使用依赖项注入(inject)为您的生产代码提供工厂

当你这样做时,你就不再需要 Powermock 了。

长话短说:在添加对 Powermock 的依赖之前;观看那些videos ,并考虑一下您是否不使用 Powermock 可能是更好的选择。

关于java - 如何模拟一个类,其对象在另一个类的类级别创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39716906/

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