我的大多数测试都具有相同的配置,我希望自己能够减少重复测试。
当我使用完整的注释列表时,测试应用程序上下文会按预期启动。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@ActiveProfiles("dev")
public class UserRepositoryTest {
@Autowired
UserRepository userRepository;
@Test
public void testSave(){
final User user = new User("test","test@test.test","test");
userRepository.save(user);
User retrievedUser = userRepository.findUserByUsername("test");
assertNotNull(retrievedUser);
assertEquals("test", retrievedUser.getUsername());
}
}
现在假设我定义了自己的自定义注释,将simillar样式中的所有类注释都包含在@SpringBootApplication
中。
所以我创建:
import com.company.Application;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@ActiveProfiles("dev")
public @interface TestContext {
}
我想要看起来美丽和懒惰: - )
@TestContext
public class UserRepositoryTest {
@Autowired
UserRepository userRepository;
@Test
public void testSave(){
final User user = new User("test","test@test.test","test");
userRepository.save(user);
User retrievedUser = userRepository.findUserByUsername("test");
assertNotNull(retrievedUser);
assertEquals("test", retrievedUser.getUsername());
}
}
当我使用新注释运行测试时,我得到:
java.lang.NullPointerException
at com.company.repository.UserRepositoryTest.testSave(UserRepositoryTest.java:33)
因为userRepository
不是@Autowired
,并且应用程序上下文甚至没有启动。日志不是特别有用。
我确信我错过了一些非常微不足道的事情或做了一件非常愚蠢的事情。
更新:感觉就像唯一无法提取的注释是:
@RunWith(SpringJUnit4ClassRunner.class)
我似乎能够提取最后的4:
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@ActiveProfiles("dev")
更新2解决方案:与Spring没什么关系。
可以找到解决方案:Java annotations - code simplifications。提取Junit注释的唯一方法是通过普通的类继承,否则将其保持独立(因此@TestContext
+ @RunWith(SpringJUnit4ClassRunner.class)
)。我将此标记为重复。