Fix primary beans with ApplicationContextAssert

Update `ApplicationContextAssert.getBean` so that multiple beans are
supported as long as one of them is primary. This aligns better with
the way that the standard `ApplicationContext.getBean` method works.

Closes gh-14874
This commit is contained in:
Phillip Webb
2018-10-24 21:30:52 -07:00
parent 06f1a0e6a2
commit 683484e4a8
2 changed files with 69 additions and 3 deletions

View File

@@ -22,6 +22,10 @@ import org.junit.Test;
import org.springframework.boot.test.context.assertj.ApplicationContextAssert.Scope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.support.StaticApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
@@ -244,6 +248,14 @@ public class ApplicationContextAssertTests {
.withMessageContaining("but found");
}
@Test
public void getBeanOfTypeWhenHasPrimaryBeanShouldReturnPrimary() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
PrimaryFooConfig.class);
assertThat(getAssert(context)).getBean(Foo.class).isInstanceOf(Bar.class);
context.close();
}
@Test
public void getBeanOfTypeWhenFailedToStartShouldFail() {
assertThatExceptionOfType(AssertionError.class)
@@ -423,4 +435,24 @@ public class ApplicationContextAssertTests {
}
private static class Bar extends Foo {
}
@Configuration
static class PrimaryFooConfig {
@Bean
public Foo foo() {
return new Foo();
}
@Bean
@Primary
public Bar bar() {
return new Bar();
}
}
}