gpt4 book ai didi

java - JMockit:模拟的 bean 集合不适用于 Stream API

转载 作者:行者123 更新时间:2023-11-30 05:27:56 24 4
gpt4 key购买 nike

我有一个简单的方法,需要使用 JMockit 进行测试,但似乎使用 Stream API 需要额外的模拟,但我不明白我到底需要添加什么。

使用for循环的方法

private final List<ValueProcessor> valueProcessors;

public List<Response> proc(Entry value) {
List<Response> badResponses = new ArrayList<>();
for (ValueProcessor processor : valueProcessors) {
List<Response> responses = processor.process(value);
if (!CollectionUtils.isEmpty(responses)) {
badResponses.addAll(responses);
}
}
return badResponses;
}

使用 Stream API 的相同代码:

public List<Response> proc(Entry value) {
return valueProcessors.stream()
.map(processor -> processor.process(value))
.filter(collection -> !CollectionUtils.isEmpty(collection))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}

我想使用JMockit测试代码,所以我有以下测试

@RunWith(JMockit.class)
public class ProcessorTest {
@Injectable
private List<ValueProcessor> valueProcessors = Collections.singletonList(processor -> Collections.singletonList(new Response()));
@Tested
private Processor processor;

@Test
public void testProc() {
assertThat(processor.proc(null)).hasSize(1);
}
}

使用 for-loop 的方法测试总是通过,使用 Stream 的方法测试总是失败。我该如何修复它?

谢谢!

最佳答案

据我了解,当您创建 valueProcessors 列表时使用@Injectable您正在创建一个列表的模拟。

这意味着上述列表的方法将被模拟,以便它们默认返回“空”值(如果通过 Expectation block 未指定任何内容)。

因此,在第一个非流代码中,由于列表中没有调用任何方法,因此不会出现问题。

但是,在第二个使用流的代码中,调用 valueProcessors.stream()执行返回空流的“空”模拟行为,因此,其他所有内容也都变为空。

我想出的解决方案是创建测试实例,并向其传递一个“真实”列表,而不是模拟列表:

@RunWith(JMockit.class)
public class StackOverflowTest {

// empty injectable just so that the processor can be created
@Injectable
private List<ValueProcessor> valueProcessors;

// availableDuringSetup = true to be able to modify the processor
@Tested(availableDuringSetup = true)
private Processor processor;

@Before
public void setUp() throws Exception {
// create new instance of the processor (now the valueProcessors list is a real list)
processor = new Processor(Collections.singletonList(processor -> Collections.singletonList(new Response())));
}

@Test
public void testProc() {
assertThat(processor.proc(null), hasSize(1));
}

}

关于java - JMockit:模拟的 bean 集合不适用于 Stream API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58183616/

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