gpt4 book ai didi

Spring 配置 - 注入(inject) Mock Bean

转载 作者:行者123 更新时间:2023-12-04 02:04:20 24 4
gpt4 key购买 nike

我正在使用 Spring、Junit 和 Mockito。我需要使用另一个 mockito 测试配置(仅在需要时注入(inject)模拟 bean)来覆盖在主 spring 配置中定义的 bean。嵌套 bean 已 @Autowired在应用程序中。

更新:
基于 alfcope的答案,添加 name 很重要属性,以便spring可以允许主bean(模拟)覆盖原始bean。否则你会得到这个异常:org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);

spring 日志中的信息消息显示:Skipping bean definition for [BeanMethod:name=bar,declaringClass=test.package.MockitoTestConfiguration]: a definition for bean 'bar' already exists. This top-level bean definition is considered as an override.
示例:
我在下面有一个简化的例子。在这里,Bar 是嵌套在 Foo 中的,我需要模拟 Bar 进行测试:

@Component
public class Foo
{
@Autowired
private Bar bar;

public String getResponseFromBar(String request)
{
String response = bar.someMethod(String request);
//do something else with this reponse
return response;
}

}

@Component
public class Bar {
public String someMethod(String request) {
String response = null;
//do something
return response;
}
}

现在进行测试,假设我想注入(inject)一个 mockbar 而不是真正的 bar。如何在下面的测试课中实现这一点?
@Profile("test")
@Configuration
public class MockitoTestConfiguration {

//adding the name attribute is important.
@Bean(name="mockBar")
@Primary
public Bar bar() {
logger.debug("injecting mock bar");
return Mockito.mock(Bar.class);
}
}

实际测试用例:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:test-context.xml")

public class FooTest {

@Autowired
Foo foo;
@Autowired
Bar mockBar; //need this to set up the mock response in the test case.

@Test
public void testAMethodInFoo_WithBarInjectedByMockito() {

//set up the mockBar response
Mockito.when(mockBar.someMethod("1")).thenReturn("1-response");

String response = foo.getResponseFromBar();
assertEquals("1-response", response);
}
}

最佳答案

基于ConfigurationClassBeanDefinitionReader代码我猜你正在使用 xml 配置来定义你的主 bean。如果是这样,只需在创建模拟 bean 时添加一个名称。

@Bean(name="mockbar") 
@Primary
public Bar bar() {
logger.debug("injecting mock bar");
return Mockito.mock(Bar.class);
}

这样,Spring 将允许您同时拥有两个 bean,并且当您使用 @Primary 时它将是您的测试使用的。

Spring overriding primary bean with non-primary bean

ConfigurationClassBeanDefinitionReader Code

关于Spring 配置 - 注入(inject) Mock Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44709070/

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