gpt4 book ai didi

java - Mockito - 注入(inject)模拟列表

转载 作者:IT老高 更新时间:2023-10-28 13:48:59 37 4
gpt4 key购买 nike

我有以下代码:

@Component 
public class Wrapper
{
@Resource
private List<Strategy> strategies;

public String getName(String id)
{
// the revelant part of this statement is that I would like to iterate over "strategies"
return strategies.stream()
.filter(strategy -> strategy.isApplicable(id))
.findFirst().get().getAmount(id);
}
}

@Component 
public class StrategyA implements Strategy{...}

@Component
public class StrategyB implements Strategy{...}

我想使用 Mockito 为其创建一个测试。我写的测试如下:

@InjectMocks
private Wrapper testedObject = new Wrapper ();

// I was hoping that this list will contain both strategies: strategyA and strategyB
@Mock
private List<Strategy> strategies;

@Mock
StrategyA strategyA;

@Mock
StrategyB strategyB;

@Test
public void shouldReturnNameForGivenId()
{ // irrevelant code...
//when
testedObject.getName(ID);
}

我在线收到 NullPointerException:

filter(strategy -> strategy.isApplicable(id))

,它表示“策略”列表已初始化但为空。Mohito 有没有办法像 Spring 一样表现得一样?将所有实现接口(interface)“策略”的实例自动添加到列表中?

顺便说一句,我在 Wrapper 类中没有任何 setter ,如果可能的话,我想以这种方式保留它。

最佳答案

使用@Spy 而不是@Mock 对其进行注释。由于 Mockito 无法监视接口(interface),因此请使用具体实现,例如 ArrayList。在测试设置期间,将模拟添加到 List spy。这样您就无需仅仅为了测试目的而更改您的测试对象。<​​/p>

@InjectMocks
private Wrapper testedObject = new Wrapper();

@Spy
private ArrayList<Strategy> mockedStrategies;

@Mock
private StrategyA strategyA;

@Mock
private StrategyB strategyB;

@Before
public void setup() throws Exception {
mockedStrategies.add(strategyA);
mockedStrategies.add(strategyB);
}

关于java - Mockito - 注入(inject)模拟列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42351117/

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