이 글을 작성하게 된 계기? 🤔
아래와 같은 S3에 업로드, 삭제 테스트를 작성하던 중 삭제를 할 때 삭제할 파일이 미리 올라가있지 않다면 해당 파일을 삭제할 수 없었다.
그렇다고 삭제하는 코드에서 한 번 더 업로드를 하는 것도 싫었고 생성 삭제를 하나의 테스트로 묶기도 싫었다.
@Test
@DisplayName("S3에 파일 업로드 테스트")
void upload() {
// given
String fileName = "test.mp4";
MultipartFile file;
try {
byte[] content = Files.readAllBytes(Paths.get("src/test/resources/test.mp4"));
file = new MockMultipartFile(fileName, fileName, "video/mp4", content);
} catch (IOException e) {
throw new RuntimeException(e);
}
// when
String result = s3Service.upload(file);
//then
assertNotNull(result);
}
@Test
@DisplayName("S3에 파일 삭제 테스트")
void delete() {
// given
String fileName = "test.mp4";
// when
s3Service.delete(fileName);
//then
assertFalse(s3Service.isValidFile(fileName));
}
@TestMethodOrder
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
를 사용해서 메서드마다 @Order( 순서 )
를 지정해줌으로써 메서드의 실행순서를 정할 수 있다는 것을 알게 되었다.
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class S3ServiceTest {
@Test
@Order(1)
@DisplayName("S3에 파일 업로드 테스트")
void upload() {
...
}
@Test
@Order(2)
@DisplayName("S3에 파일 삭제 테스트")
void delete() {
...
}
}
최종적으로 MethodOrder를 지정해주고 fileName을 공유해서 관리함으로써 테스트 코드를 완성할 수 있었다. 🎉
아래는 최종 완성된 코드 👇
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class S3ServiceTest {
@Autowired
private S3Service s3Service;
@Value("${cloud.aws.s3.bucket}")
private String bucket;
private String fileName = "test.mp4";
@Test
@Order(1)
@DisplayName("S3에 파일 업로드 테스트")
void upload() {
// given
MultipartFile file;
try {
byte[] content = Files.readAllBytes(Paths.get("src/test/resources/" + fileName));
file = new MockMultipartFile(fileName, fileName, "video/mp4", content);
} catch (IOException e) {
throw new RuntimeException(e);
}
// when
fileName = s3Service.upload(file);
//then
assertNotNull(fileName);
}
@Test
@Order(2)
@DisplayName("S3에 파일 삭제 테스트")
void delete() {
// given
// when
s3Service.delete(fileName);
//then
assertFalse(s3Service.isValidFile(fileName));
}
@Test
@Order(3)
@DisplayName("S3에 파일 존재하는지 확인")
void isValidFile() {
// given
String fileName = "test.mp4";
// when
boolean result = s3Service.isValidFile(fileName);
//then
assertFalse(result);
}
}
'Spring > Best Practice' 카테고리의 다른 글
Spring Boot HTTPS 발급받고 설정 (0) | 2024.03.16 |
---|---|
Spring Boot 동영상/파일 업로드 (0) | 2024.03.04 |
Spring Boot Youtube Upload 구현하기 (0) | 2024.03.04 |