4

I want to inject DeMorgenArticleScraper in a test.

@RunWith(SpringJUnit4ClassRunner.class) public class DeMorgenArticleScraperTest { @Autowired private DeMorgenArticleScraper deMorgenArticleScraper; ... } 

The DeMorgenArticleScraper component has some configuration going on for itself, but the IDE/compiler is not complaining about them.

@Component public class DeMorgenArticleScraper extends NewsPaperArticleScraper { @Autowired public DeMorgenArticleScraper( @Qualifier("deMorgenSelectorContainer") SelectorContainer selector, GenericArticleScraper genericArticleScraper, @Qualifier("deMorgenCompany") Company company) { super(selector, genericArticleScraper, company); } ... } 

The constructor parameters that are annotated with @Qualifier, are defined in a Config.class With @Bean. The class itself has @Configuration. I figure the problem is not situated here.

The IDE warns me already, no bean found...autowired members must be defined in a bean. But as far as I know, it is defined in a bean with the @Component annotation. All other bean wiring seems ok as the Spring boot application can start (when I comment out the test class).

4
  • 1
    Commenting by memory, should it be "@InjectMocks" that should go in DeMorgenArticleScraperTest instead of "@Autowired". I don't remember having "@Autowired" anotation in Junittest Commented Jun 27, 2017 at 19:13
  • I played around with the class annotation of the test after your comment and found something that works. Thank you. Commented Jun 27, 2017 at 19:30
  • I would suggest that you answer your own question with the solution for Stack overflow sake! Glad it helped Commented Jun 27, 2017 at 19:31
  • I'll better answer first and comment second in the future :) Commented Jun 27, 2017 at 19:35

5 Answers 5

10

I replaced

@RunWith(SpringJUnit4ClassRunner.class) 

with

@SpringBootTest @RunWith(SpringRunner.class) 

This appears to be working fine: I see Spring boot firing up and loading beans. I'll keep this question open for a short while for better suggestions.

Sign up to request clarification or add additional context in comments.

Comments

9

@SpringBootTest is fairly heavyweight, and for all intents and purpose will load your entire application, https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications, it's fairly heavyweight and dramatically affects test time. Depending on what you are trying to test you may want to look into

3 Comments

Ah now I found what I was looking for. I read about the ContextConfiguration annotation but I missed the fact that it is possible to pass Component annotated classes to it. Ty!
I agree with this answer, SpringBootTest is too much for what I wanted to test. I needed to Autowire a @Configuration class holding property values. In this case, for me, it worked using the @ContextConfiguration, plus the @TestPropertySource("prop-file") and @EnableConfigurationProperties(Conf.class)
Use slice tests and mock certain dependent but "not required for tests" beans with @MockBean annotation
3

I ran into similar problem where my spring context was not getting initialized and therefore I was not able to inject the bean with @Autowired annotation. Then I came across this post and tried with the below annotations as suggested by @progonkpa and it started working.

@SpringBootTest @RunWith(SpringRunner.class) 

But then I realized that @SpringBootTest already contains @ExtendWith({SpringExtension.class}) annotation which is Junit5 equivalent of @RunWith(SpringRunner.class) thus it should load spring-context while running the test. Then I found out the silly mistake I made to import @Test annotation from junit4(i.e org.junit.Test;) instead of junit5(i.e org.junit.jupiter.api.Test;) library. I changed the @Test from junit5 library and it started working with a single annotation @SpringBootTest.

p.s : don't forget to exclude junit4 library from your dependency if you are using junit5

1 Comment

Depending on the version. I am running Spring Boot 1.5, and @SpringBootTest does not include @ExtendWith({SpringExtension.class}) nor @RunWith(SpringRunner.class). So, it must be included alongside @SpringBootTest.
0

I have the same problem.

  1. There is service, which I want to inject for testing but I want to test only platformToSql(..) method without launching whole Spring Boot application.

    @Service public class ConverterToSqlImpl implements IConverterToSql { private final ISomeRepository someRepository; private final IUtilService utilService; public ConverterToSqlMainConstructorServiceImpl( IWorkerUtilService workerUtilService, ISomeRepository someRepository) { this.utilService = utilService; this.someRepository = someRepository; } @Override public String platformToSql(String platformName) { return "platform='" + platformName + "'"; } @Override public String methodWhichUseRepositoryAndUtilBeans() { // some code which is not interested us } } 
  2. I create test class. It is necessary to mock beans because they are not need for test method.

    @RunWith(SpringRunner.class) @SpringBootTest(classes = {ConverterToSqlImpl.class}) //@ContextConfiguration(classes = {ConverterToSqlImpl.class}) @MockBeans({@MockBean(IUtilService.class), @MockBean(ISomeRepository.class)}) public class SqlConverterConstructorTest { @Autowired private IConverterToSqlMainConstructorService convertToSql; @Test public void platformTest() { String platformSql = convertToSql.platformToSql("PLATFORM_1"); String expectedSql = "platform='PLATFORM_1'"; Assert.assertEquals(platformSql, expectedSql); } } 

@SpringBootTest(classess = {}) load to ApplicationContext only classess which are pointed out in classess section, not whole application with all beans will be lauched.

Also, as alternative to @SpringBootTest with classes={..}, you can uncomment line with @ContextConfiguration. It is plain old style.

Comments

0

Using Junit5 worked for me and then just the @SpringBootTest and @ActiveProfiles ("test") annotation was sufficient. Of course, I had to have an application-test.properties in the /test/resources path.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.