gpt4 book ai didi

java - 当构造函数作为方法引用出现在流中时,如何模拟它?

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

我想测试以下类 Foo 的构造函数。

import java.util.List;
import java.util.stream.Collectors;

public class Foo {
public List<Bar> bars;

public Foo(List<Integer> list) {
bars = list.stream()
.map(Bar::new)
.collect(Collectors.toList());
}
}

其中 Bar 如下所示:

public class Bar {
public Bar(Integer baz) {
throw new RuntimeException("This crashes, but who cares, I’m testing Foo!");
}
}

由于我对 Bar 的实现充满信心,因此我想通过模拟 Bar::new 来测试我的 Foo 实现>.

这是我尝试过的:

import java.util.Arrays;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class) // where Bar::new is referenced
public class FooTest {
@Test
public void testFoo () throws Exception {
Bar firstBar = PowerMockito.mock(Bar.class);
Bar secondBar = PowerMockito.mock(Bar.class);

PowerMockito.whenNew(Bar.class).withArguments(1)
.thenReturn(firstBar);
PowerMockito.whenNew(Bar.class).withArguments(2)
.thenReturn(secondBar);

Foo actual = new Foo(Arrays.asList(1, 2));

Assert.assertNotNull(actual);
Assert.assertNotNull(actual.bars);
Assert.assertEquals(firstBar, actual.bars.get(0));
Assert.assertEquals(secondBar, actual.bars.get(1));
}
}

在这种情况下,实际的 Bar::new 被调用,并且 RunTimeException 被引发。回想起来这是有道理的,因为对 new 的实际调用不是在 Foo 中进行的(它会被 mock ),而是在一些与流相关的匿名类中进行(我认为 )。

如何在不依赖 Bar 构造函数的实际实现的情况下实现测试 Foo 的最初目标?

最佳答案

好的,我已经知道是怎么回事了。表达式 Bar::new 是 PowerMock 无法模拟的 lambda。如果您将其重写为 i -> new Bar(i) 即使用显式的“new Bar”运算符 - 它可以正常工作。

所以,重点是避免使用 POWERMOCK - 这很糟糕!请参阅我的另一个答案。

关于java - 当构造函数作为方法引用出现在流中时,如何模拟它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915105/

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