<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.2.18.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.5.RELEASE</version> </dependency>
※spring-web 使用在 spring web 時;spring-webmvc 使用在 spring mvc
※
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import bean.Apple;
import bean.Banana;
// @ContextConfiguration(locations = { "classpath*:/applicationContext.xml" })
@ContextConfiguration(classes = { Apple.class })
// @RunWith(SpringRunner.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class AppTest {
@Autowired
private Apple apple;
@Autowired
private Banana banana;
@Test
public void testSomeLibraryMethod() {
System.out.println("apple=" + apple);
System.out.println("banana=" + banana);
}
}
※@RunWith 二選一
※@ContextConfiguration 有 locations 和 classes,看要用設定檔或是 Annotation
※測 web 或 mvc 時,有可能要抓 WEB-INF 的路徑,可用 ApplicationContext app = new FileSystemXmlApplicationContext("src/main/webapp/WEB-INF/applicationContext.xml");
和 @ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/applicationContext.xml")
※spring-test 包的 annotation
必需加 @ContextConfiguration 和 @RunWith,不加也不會報錯,只是使用 spring 的 annotation時,一點效果都沒有而已※@Repeat、@Timed、@IfProfileValue
@ContextConfiguration(locations = { "classpath*:/applicationContext.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class AppTest {
@Repeat(3)
@Test
public void testRepeat() {
System.out.println("yeah");
}
@Timed(millis = 1000L)
@Test
@Ignore
public void testTimed() {
try {
System.out.println("yeah1");
Thread.sleep(2000);
System.out.println("yeah2");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("yeah3");
}
@IfProfileValue(name = "java.specification.version", values = "8")
@Test
@Ignore
public void testIfProfileValue() {
System.getProperties().list(System.out);
}
}
※@Timed 官網有說在失敗之前會完成測試,我試的結果不管怎麼樣都會成功,可能就是這個原因吧!
※@ProfileValueSourceConfiguration
配合@IfProfileValue,沒有@ProfileValueSourceConfiguration,預設是 SystemProfileValueSource參數給一個類別,這個類別要實作 ProfileValueSource 介面
※
public class MyPVS implements ProfileValueSource {
@Override
public String get(String key) {
System.out.println("key=" + key);
return System.getProperty(key);
}
}
@ContextConfiguration(locations = { "classpath*:/applicationContext.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@ProfileValueSourceConfiguration(MyPVS.class)
public class AppTest {
@Test
@IfProfileValue(name = "java.specification.version", values = "10")
public void testXxx() {
System.out.println("xxx");
}
}
※get 方法返回值等於 @IfProfileValue 的 values 值就會執行
※@ActiveProfiles、@Profile
.@Profile 裡面寫個字串,每一個 class 都可以有一個 @Profile.@ActiveProfiles 裡面也是寫字串,只有裡面的字串和 @Profile 裡的字串一樣,才會被加載
@Component
public class App {}
@Component
@Profile("dev")
public class Animal {}
@Component
@Profile("product")
public class Bird {}
@ContextConfiguration(classes = { App.class, Animal.class, Bird.class })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("product")
public class AppTest {
@Autowired(required = false)
private App app;
@Autowired(required = false)
private Animal animal;
@Autowired(required = false)
private Bird bird;
@Test
public void testApp() {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
for (String s : app.getBeanDefinitionNames()) {
System.out.println(s);
}
app.close();
System.out.println("app=" + this.app);
System.out.println("animal=" + animal);
System.out.println("bird=" + bird);
}
}
※使用 ClassPathXmlApplication 只能抓沒有 @Profile 的 App
※寫在 AppTest 的全域變數才是 @ActiveProfiles 參數裡有對應到 @Profile 參數才能抓到的 bean
※還是要加 @ContextConfiguration 和 @RunWith,否則三個全域變數都是 null
沒有留言:
張貼留言