gpt4 book ai didi

java - JMockit:覆盖@Mocked类

转载 作者:行者123 更新时间:2023-11-30 11:03:06 26 4
gpt4 key购买 nike

我有一个内部 StreamGobbler 类,其中有 7 个方法。我正在寻找一种默认情况下模拟所有方法的快速方法,但覆盖一个名为 getOutput() 的方法(例如部分模拟)。

(为清楚起见未显示完整代码)

public class StreamGobbler extends Thread
{
public String getOutput()
public void run()
}

我想要的是结合使用 @Mocked 注释和 MockUp 来部分模拟 getOutput 方法,但在所有其他方法上保留所有“默认”模拟代码。在有关部分模拟的文档中,指出如果您使用 MockUp,则所有非 @Mock 方法都将保留其正常功能。有时这很好,但在这种情况下这不是我想要的。

这类似于问题 JMockit: @Mocke and MockUp combination in the same test ,但我不能只看方法计数。

如果我有这样的测试设置:

@Test
public void execute(@Mocked StreamGobbler sg)
{
new MockUp<StreamGobbler>()
{
String type = null;

@Mock
void $init(String type)
{
this.type = type;
}

@Mock
String getOutput()
{
if ("OUTPUT".equals(type))
{
return "test output";
}
else
{
return "";
}
}
}
}

我收到此错误 java.lang.IllegalArgumentException: Class already mocked

如果我尝试在 MockUp 中添加 @Override 注释,它没有帮助(并且 Eclipse 对此有所提示)

处理此问题的最佳方法是什么?在这个测试方法之外使用静态类?

使用 JMockit 1.17 和 TestNG

总而言之,我如何让 StreamGobbler 中的每个方法都被模拟(与 @Mocked 一样),但部分覆盖一个方法(而不是我自己在 MockUp 中手动完成?)

最佳答案

满足给定约束的完整示例代码:

public static class StreamGobbler extends Thread {
public StreamGobbler(String type) {}
public String getOutput() { return null; }
@Override public void run() {}
}

public static class TestedClass {
public String doSomething() throws InterruptedException {
StreamGobbler sg1 = new StreamGobbler("OUTPUT");
sg1.start();

StreamGobbler sg2 = new StreamGobbler("ERROR");
sg2.start();

sg1.join(5000);
sg2.join(5000);

String output1 = sg1.getOutput();
String output2 = sg2.getOutput();
return output1 + '|' + output2;
}
}

@Test
public void useStreamGobbler(@Mocked StreamGobbler sg) throws Exception {
new Expectations() {{
new StreamGobbler("OUTPUT").getOutput(); result = "test output";
new StreamGobbler("ERROR").getOutput(); result = "";
}};

String output = new TestedClass().doSomething();

assertEquals("test output|", output);
}

关于java - JMockit:覆盖@Mocked类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539136/

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