Support Qualifiers on MockBean and SpyBean
Previously, if an injection point used a qualifier, `MockBean` and `SpyBean` couldn't be used to mock/spy it as there was no way to specify that qualifier information. This commit now detects qualifier information on the injection point and associate it with the created `BeanDefintion`. If one wants to mock a bean that is qualified with `@Qualifier("foo")`, the definition of the mock should be as follows: ``` public class MyTest { @MockBean @Qualifier("foo") private ExampleService service; } ``` As a side effect, it is now possible to mock a service by type even if there are multiple instances of that type in the application context. The provided qualifier information is used to determine the right candidate and the proper bean definition is replaced accordingly. Closes gh-6753pull/6909/head
parent
3e19f8aa8d
commit
3f236dc951
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.test.mock.mockito;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.mock.mockito.example.CustomQualifier;
|
||||||
|
import org.springframework.boot.test.mock.mockito.example.CustomQualifierExampleService;
|
||||||
|
import org.springframework.boot.test.mock.mockito.example.ExampleService;
|
||||||
|
import org.springframework.boot.test.mock.mockito.example.ExampleServiceCaller;
|
||||||
|
import org.springframework.boot.test.mock.mockito.example.RealExampleService;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test {@link MockBean} on a test class field can be used to replace existing bean
|
||||||
|
* while preserving qualifiers.
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
public class MockBeanOnTestFieldForExistingBeanWithQualifierIntegrationTests {
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
@CustomQualifier
|
||||||
|
private ExampleService service;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ExampleServiceCaller caller;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMocking() throws Exception {
|
||||||
|
this.caller.sayGreeting();
|
||||||
|
verify(this.service).greeting();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onlyQualifiedBeanIsReplaced() {
|
||||||
|
assertThat(this.applicationContext.getBean("service")).isSameAs(this.service);
|
||||||
|
ExampleService anotherService = this.applicationContext.getBean(
|
||||||
|
"anotherService", ExampleService.class);
|
||||||
|
assertThat(anotherService.greeting()).isEqualTo("Another");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
static class TestConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CustomQualifierExampleService service() {
|
||||||
|
return new CustomQualifierExampleService();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ExampleService anotherService() {
|
||||||
|
return new RealExampleService("Another");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ExampleServiceCaller controller(@CustomQualifier ExampleService service) {
|
||||||
|
return new ExampleServiceCaller(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.test.mock.mockito.example;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
|
||||||
|
@Qualifier
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface CustomQualifier {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.test.mock.mockito.example;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An {@link ExampleService} that uses a custom qualifier.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
@CustomQualifier
|
||||||
|
public class CustomQualifierExampleService implements ExampleService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String greeting() {
|
||||||
|
return "CustomQualifier";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue