gpt4 book ai didi

java - 在 Java 中测试紧密耦合的类

转载 作者:行者123 更新时间:2023-12-02 02:12:51 24 4
gpt4 key购买 nike

我有这个原始代码:

public SomeClass(int parameter) {
this.someProperty = parameter;
this.apiObject = new SomeApiClass(someProperty);
for(i=0; i < 2; i++)
apiObject.setApiProperty(i, "Hello World");
}

代码运行得非常好。但当我尝试测试相同的内容时,问题就出现了。

    @Mock
private SomeApiClass someApiClass;

private SomeClass someClass;


@Before
public void setUp() throws Exception {
someClass = new SomeClass(3);
}

@Test
public void shouldCreateSomeClass() {
verify(someApiClass, times(2)). setApiProperty(anyInt(),anyString());
}

我明白为什么这个测试无法通过。如果我将构造函数更改为:

public SomeClass(int parameter, SomeApiClass someApiClass) {
...
}

如果我不想将 SomeApiClass 注入(inject)构造函数并且也无法在其中提供任何 getter,我该如何测试原始代码。

PS:请忽略代码中的拼写错误。即时输入。

最佳答案

在设计类时最好考虑可测试性,并区分参数和依赖项。

依赖项是类完成其工作所依赖的对象。它们通常在依赖对象的整个生命周期中不会改变。

参数比依赖项更本地化。它们预计会在调用对象方法之间发生变化。

在原始代码中,SomeClass 的构造函数中完成的工作看起来应该真正进入方法内部:

public class SomeClass {


public void doWork(int parameter) {
//
}

}

在方法内部,如果您只想使用参数实例化 SomeApiObject,那么为什么不遵循 Demeter 法则,直接将 SomeApiObject 作为参数传入:

public void doWork(SomeApiObject someApiObject) {
//
}

然后消费者完成工作:

someClass.doWork(new SomeApiObject(3));

并且可以通过传入模拟的 SomeApiObject 作为参数来测试它:

//act
someClass.doWork(mockedSomeApiObject);

//assert
verify(mockedSomeApiObject).someVerification();

但是,如果您想要参数和依赖项的组合,您可以使用工厂作为依赖项:

public class SomeClass {

private final SomeApiObjectFactory someApiObjectFactory;

public SomeClass(SomeApiObjectFactory someApiObjectFactory) {
this.someApiObjectFactory = someApiObjectFactory;
}

public void doWork(int parameter) {
SomeApiObject someApiObject = someApiObjectFactory.create(parameter);
//etc
}

然后您现在可以测试该类,因为您有办法提供可以验证行为的模拟:

SomeApiObject mockSomeApiObject = Mockito.mock(SomeApiObject.class); 
when(mockSomeApiObjectFactory.create(anyInt()).thenReturn(mockApiObject);

除此之外,还有一些方法可以使用 Powermockito 来测试您的原始类,因为它没有改变,但这些方法并不理想,最好尽可能重构,以便您可以使用普通的 Mockito 来测试。这会给你良好的面向对象的习惯。祝你好运!

关于java - 在 Java 中测试紧密耦合的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49706357/

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