gpt4 book ai didi

测试公共(public)方法时 Jmockit 对私有(private)方法调用的期望/验证?

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

任何人都可以建议是否可以使用期望/验证来测试私有(private)方法是否被调用正确的次数/正确的参数。

被测类已被模拟 - 重写了一个私有(private)方法。

正在测试调用许多私有(private)方法的公共(public)方法。

我想知道是否可以验证对公共(public)方法执行时将调用的其他私有(private)方法的调用?

对被测代码/类的一些想法;

public class UnderTest {

public void methodPublic(arg 1){
.....
methodPrivate1(var1);
....
methodPrivate2(var2);
}

private void methodPrivate1(var1){
//do stuff
}

private void methodPrivate2(var1){
//do stuff
}

}

在我的测试用例中

@Test
public void stateBasedTestMethod()
{
UnderTest underTest;

new MockUp<UnderTest>() {
@Mock(invocations = 1)
private void methodPrivate2(var1) {
//do nothing in the mocked case
}
};

underTest = new UnderTest();
underTest.methodPublic(arg1);

new Verifications() {{
// Is there a way to test that methodPrivate1 has been called-once/with-expected-arguments
}};
}
<小时/>

针对 Rogério 的回答进行编辑。我正在使用 jmockit 1.12并且验证失败,因为使用提供的解决方案的方法调用该方法两次,正如我从 JMockit 文档中想到的那样。

故障跟踪;mockit.internal.UnexpectedInitation:预期对 MyHelperTest$1#method3... 进行了 1 次调用,但被调用了 2 次

其中包含我为此使用的完整代码。如上所述 - 我的目标是模拟私有(private)方法之一以不执行任何操作。并确保我可以验证另一个私有(private)方法仅被调用一次。

提前致谢,如果 Jmockit 可以实现这一点,希望能得到更好的理解。

测试代码。

public class MyHelperTest {

@Test
public void testHelper(@Mocked final MyDependent myDependent) {

final MyHelper myHelper;

new MockUp<MyHelper>() {

@Mock(invocations = 1)
private void method3(MyDependent myTable) {
System.out.println("In Mocked Method");
//do nothing in the mocked case
}

};

myHelper = new MyHelper();

myHelper.method1(myDependent);

new Verifications() {{
invoke(myHelper, "method2", myDependent); times = 1;
}};
}

}

正在测试的类。

public class MyHelper {

public void method1(MyDependent myDependent){
method2(myDependent);
}

private void method2(MyDependent myDependent) {
myDependent.setValue(1);
method3(myDependent);
}

private void method3(MyDependent myDependent) {
myDependent.setValue(2);
}

}

依赖类

public class MyDependent {

private int value;

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

}

最佳答案

这是可能的,但不建议模拟私有(private)方法。

使用期望 API:

@Tested @Mocked MyHelper myHelper;

@Test
public void testHelper(@Mocked final MyDependent myDependent)
{
new NonStrictExpectations() {{ invoke(myHelper, "method3", myDependent); }};

myHelper.method1(myDependent);

new Verifications() {{ invoke(myHelper, "method2", myDependent); times = 1; }};
}

...其中 invoke(...) 方法是从类 mockit.Deencapsulation 静态导入的。

关于测试公共(public)方法时 Jmockit 对私有(private)方法调用的期望/验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26168759/

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