title: How to do unit test for Spring boot standalone application?
body: <p>I have a Spring Boot based standalone (non-web) application following this tutorial:
  <a href="https://www.mkyong.com/spring-boot/spring-boot-jdbc-mysql-hikaricp-example/" rel="nofollow noreferrer">https://www.mkyong.com/spring-boot/spring-boot-jdbc-mysql-hikaricp-example/</a></p>
  
  <p>I skip the hikaricp part as am using mysql directly. 
  The application works fine, able to query, call a RESTful web service... However, I cannot have junit test work, keep getting this error:</p>
  
  <pre><code>java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
      at org.springframework.util.Assert.state(Assert.java:70)
      at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.getOrFindConfigurationClasses(SpringBootTestContextBootstrapper.java:202)
      at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.processMergedContextConfiguration(SpringBootTestContextBootstrapper.java:137)
      at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:409)
      at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildDefaultMergedContextConfiguration(AbstractTestContextBootstrapper.java:323)
      at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:277)
      at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:112)
      at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.buildTestContext(SpringBootTestContextBootstrapper.java:82)
      at org.springframework.test.context.TestContextManager.&lt;init&gt;(TestContextManager.java:120)
      at org.springframework.test.context.TestContextManager.&lt;init&gt;(TestContextManager.java:105)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.&lt;init&gt;(SpringJUnit4ClassRunner.java:143)
      at org.springframework.test.context.junit4.SpringRunner.&lt;init&gt;(SpringRunner.java:49)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
      at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
      at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
      at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
      at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
      at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
      at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
      at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
      at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:36)
      at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:275)
      at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
      at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:149)
      at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
      at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
      at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
      at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
  </code></pre>
  
  <p>The related junit test code:</p>
  
  <p>`   </p>
  
  <pre><code>@RunWith(SpringRunner.class)
  @RestClientTest(ArrivalRestClient.class)
  public class ArrivalRestClientTest {
      private static final String MOCK_URL = "http://baseURI/arrival";
      @Autowired
      private ArrivalRestClient clientUnderTest;  
      @Autowired
      private ObjectMapper objectMapper;
      @Autowired
      private MockRestServiceServer mockServer;
      @Autowired
      private RestTemplate restTemplate;
      @Before
      public void setUp() throws Exception {
              mockServer = MockRestServiceServer.createServer(restTemplate);
              clientUnderTest = new ArrivalRestClient(MOCK_URL);
              ReflectionTestUtils.setField(clientUnderTest, "restTemplate", restTemplate);
  
      }
      @Test
      public void testGetArrivals() throws JsonProcessingException {
  
          Arrival arrival = new Arrival("JohnTest1", "GLBProduct", 0L);
          String arrivalString = objectMapper.writeValueAsString(arrival);
          this.mockServer.expect(requestTo("/arrival?source=source1&amp;entity=entity1&amp;timestamp=1000")).andRespond(withSuccess(arrivalString, MediaType.APPLICATION_JSON));
  
          Arrivals actual = clientUnderTest.getArrivals("JohnTest1", "GLBProduct", 0);
  
          System.out.println("getExpectedtime: " + actual.getNextRunTime());
          System.out.println("getPartitions: " + actual.getPartitions());
  
          assertEquals((long)2000, actual.getNextRunTime());
          assertEquals(new Long[]{ (long)2,(long)3}, actual.getPartitions());
  
      }
  }`
  </code></pre>
  
  <p>Even an empty unit test fails. Believe it is related to the fact that it is a Spring Boot standalone application (non-web). I cannot find hints on how to unit it online, thanks for your help! </p>
  
  <p>Edit--- also add my main class code:</p>
  
  <pre><code>@SpringBootApplication
  public class DepManagerMain implements CommandLineRunner {
  
      final static Logger logger = Logger.getLogger(DepManagerMain.class);
  
      @Autowired
      DataSource dataSource;
  
      public static void main(String[] args) throws Exception {
          SpringApplication app = new SpringApplication(DepManagerMain.class);
          app.run(args);
      }
  
      @Override
      public void run(String... args) throws Exception {
          logger.info("DependencyManager starting");
          logger.info("DATASOURCE = " + dataSource);
          ...
      }
  }   
  </code></pre>