토비의 스프링을 보면서 예제 코드를 직접 따라 쳐 보고 실행도 해 보고 있다.
책 내용을 보면 일일히 라이브러리를 추가하는 것 같이 되어 있는데, 일일히 추가하기 귀찮아서 Spring Initializr와 Gradle을 이용해 프로젝트를 실행해 보고 있었다.
워낙 오래된 책이다보니 예제 중에서는 deprecated된 메소드들이 있지만, 최대한 책 예제를 따라서 작성해 보려고 하는 중이다.
코드만 잘 따라치면 되지, 빌드 도구는 Gradle로 해도 큰 문제가 없을 거라 생각했는데.. 결론적으로는 Maven으로 바꿨다..
문제가 되었던 부분은 토비의 스프링에서 리스트 2-17 부분.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/applicationContext.xml")
public class UserDaoTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
JUnitCore.main("com.example.demo3.dao.UserDaoTest");
}
여기서 SpringJUnit4ClassRunner와 @ConTextConfiguration을 인식하지 못하는 문제가 발생했었다.
build.gradle은 아래와 같았다.
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.9'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'junit:junit:4.13.1'
implementation 'org.springframework:spring-jdbc:5.3.9'
implementation 'mysql:mysql-connector-java:8.0.26'
testImplementation 'org.springframework:spring-test:5.3.9'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnit()
}
.gradle을 날리고 별 짓을 해봐도 계속 인식을 하지 못하는 오류가 발생..
빌드 로그에는 cannot find symbol @ContextConfiguration, cannot find symbol @RunWith(SpringJUnit4ClassRunner.class)가 계속해서 나왔다.
UserDaoTest.java:19: error: cannot find symbol
@ContextConfiguration(locations="/applicationContext.xml")
^
symbol: class ContextConfiguration
UserDaoTest.java:18: error: cannot find symbol
@RunWith(SpringJUnit4ClassRunner.class)
chatGPT에게 열심히 물어본 결과, UserDaoTest 클래스가 src/main/java 경로가 아닌 src/test/java 디렉터리에 있어야 한다고 대답해 줬다.
왜 src/test/java에 위치해야 하는지 물어봤는데, 아래와 같이 알려주더라. (단순 참고만 하자)
경로를 옮기니까 우선 build 에러는 나지 않는다. 기존에 있던 com.example.demo.dao의 UserDaoTest는 제거했다.
실행할 때 main에서 실행하면 아래와 같은 에러가 발생한다.
Execution failed for task ':test'.
> No tests found for given includes: [com.example.demo.UserDaoTest.main](filter.includeTestsMatching)
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
main이 아닌 클래스 자체에서 실행하면 해결. 혹은 main을 지워도 된다.
Gradle이 아닌 Maven 위에 올리면 src/main/java에서도 테스트를 실행할 수 있고, main 또한 실행이 가능하다.
Gradle에서도 동작을 하긴 하지만 JUnitCore.main이 제외되는 부분이 있어 책 예제를 따라하기에는 Maven 환경이 낫다고 판단했다.