sourcecode

스프링 부트:장치 테스트에서 클래스 경로에서 리소스를 읽는 방법

copyscript 2023. 2. 28. 23:43
반응형

스프링 부트:장치 테스트에서 클래스 경로에서 리소스를 읽는 방법

유닛 테스트에서 다음과 같은 classpath 파일을 읽으려고 합니다.

@Value("classpath:state.json")
Resource stateFile;

있습니다state.json줄지어 들어가다src/test/resources디렉토리로 이동합니다.이 파일을 읽으려고 할 때stateFile.getInputStream()콘텐츠는 반환되지 않습니다.내가 뭘 잘못하고 있지?

나의 시험 수업은 이렇게 주석을 달았다.

@RunWith(SpringRunner.class)
@SpringBootTest

잘못된 파일로 시도하면 코드가 실패한다는 것을 알 수 있습니다.그래서 나는 classpath에서 파일을 보는데 어떤 이유에서인지 내용을 읽지 않는 것 같다.

난 이걸 우연히 만났어.메이븐을 쓰고 있어요.타겟/테스트 클래스 폴더를 확인했는데 리소스 파일이 없습니다(src/test/resources 폴더에 있었는데도).

나는 달렸다mvn clean install대상/테스트 대상 폴더를 다시 확인하면 리소스 파일이 표시됩니다.그 후, 제 테스트는 파일을 찾을 수 있었고, 테스트는 성공했습니다.

따라서 리소스가 복사되지 않는 경우mvn cleanJUnit은 maven에 의해 구축된 클래스 경로를 찾고 있으며 파일이 실제로 타겟/테스트 클래스 폴더에 들어갈 때까지 JUnit은 찾을 수 없습니다.

속성이 정의되지 않은 경우 @Value 리소스에 액세스할 수 없습니다.이렇게 해야 돼.

@Value("${stateJsonPath}")
Resource stateFile;

하드코드된 경로에서 리소스를 가져와야 하는 경우 이 방법을 사용하십시오.

Resource stateFile = new ClassPathResource("state.json");

이것은 간단하게 동작합니다.경로는 현재 디렉토리를 나타내는 점으로 시작하는 것에 주의해 주세요.

@Test   
public void testFile() {
    String path = "./src/test/resources";
    String fileName = "test.zip";

    File file = new File(path, fileName);

    assertTrue(file.exists());
}

후세를 위해 운용 중인 솔루션을 공유합니다.클래스 경로에 있는 파일은 다음 방법으로 읽을 수 있습니다.org.springframework.core.io.ResourceLoader예를 들어, 저는 샘플 데이터 파일을 가지고 있습니다.posts.json디렉토리 아래에src/test/java/resources/data테스트 케이스 실행 중에 로드해야 합니다.@Before

@ActiveProfiles("test")
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SampleTest {

    @Autowired
    private ResourceLoader resourceLoader = null;

    @BeforeEach
    void init() {
        File dataFile = resourceLoader.getResource("classpath:data/posts.json").getFile();
        ...
        ...
    }

}

참고: 분류자를 사용할 경우 파일은 클래스 경로에 있어야 합니다.

언급URL : https://stackoverflow.com/questions/43428305/spring-boot-how-to-read-resource-from-classpath-in-unit-test

반응형