Spring

데이터베이스 연결 없이 스프링 부트 테스트

기록만이살길 2022. 11. 13. 20:32
반응형

데이터베이스 연결 없이 스프링 부트 테스트

1. 질문(문제점):

처음에는 테스트 클래스 위에 다음 어노테이션이 있었습니다.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc

해당 구성을 사용하면 내 데이터베이스에 연결을 시도하는데, 내 데이터베이스가 실행되고 있지 않으면 다음 오류가 발생합니다.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
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)

데이터베이스에 연결하지 않고 테스트를 실행하고 싶습니다. 이것이 어노테이션을 변경하려고 시도한 이유입니다. 따라서 테스트 클래스는 이제 다음과 같습니다.

@RunWith(SpringRunner.class)
@DataJpaTest
@WebMvcTest(CitizenController.class)
@AutoConfigureMockMvc
public class CitizenControllerTest {

@Autowired
private MockMvc mockMvc;

@MockBean
private CitizenRepository citizenRepository;

@MockBean
private WeeklyCareRepository weeklyCareRepository;

@MockBean
private SubCategoryCareRepository subCategoryCareRepository;

@Autowired
private ObjectMapper objectMapper;

private static List<Citizen> mockCitizenList;

private String citizenJson;

그러나 이제 다른 오류가 발생합니다.

java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith for test class [controllers.CitizenControllerTest]: [@org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.context.SpringBootTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper)]

데이터베이스 연결 없이 테스트를 실행할 수 있습니까? 그렇다면 내가 무엇을 잘못하고 있습니까?

2. 해결방안:

@Test 메소드에서 저장소 클래스의 데이터베이스에 연결할 메소드를 조롱할 수 있습니다.

@SpringBootTest
@AutoConfigureMockMvc
class StoreApplicationTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private CitizenRepository citizenRepository;


    @Test
    void contextLoads() {
    }

    @Test
    public void test() {

        Mockito.when(citizenRepository.getDataFromDB()).thenReturn("Something you'd like to Return");

    }

}

그 후에는 citizenRepository.getDataFromDB()가 호출될 때 데이터베이스에 연결하지 않습니다.


귀하의 의견 후 업데이트:

그런 다음 "src/test/resources"를 생성하고 "src/main/resources"에서 application.properties 또는 application.yml을 해당 디렉토리로 복사하고 mysql 연결 부분에 어노테이션을 달 수 있습니다.

"src/test/resources/application.properties"가 없으면 spring은 기본적으로 "src/main/resources/application.properties"를 읽고 해당 파일에 따라 프로젝트를 구성합니다. 그것, Spring은 데이터베이스에 연결을 시도합니다. 데이터베이스 서버가 다운되면 실패합니다.

반응형