junit
junit的pom.xml配置
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.12</version>
</dependency>
junit基本注解
@BeforeClass
方法体必须是static,并且他最先执行
@Before
@After
@Test
例子
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class CzTest {
@BeforeClass
public static void init() {
System.out.println("aaa_@BeforeClass");
}
@Before
public void setUp() {
System.out.println("aaa_setUp");
}
@After
public void tearDown() {
System.out.println("aaa_down");
}
@Test
public void assertLoadConfigFromProperty() {
System.out.println("aaa_test");
}
}
assertThat断言
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
String temp = "aaa";
assertThat(temp, is("aaa")); //如果temp不是aaa则会中断跑不下去
boolean flag = false;//false会抛异常 true会直接过
Assert.assertTrue("the message should true ,but now value is false",flag);
int count = 5;//count=0能往下走,count=5走不下去
Assert.assertEquals("the value should 0,but now the value is ",0,count);
@Suite
通过@Suite将测试用例顺序执行
package com.qbsea.cz;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
CzTest.class,
Xxxx.class
})
public class AllTests {
}
spring与junit
配置文件的引入
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations={“classpath:application.xml”,“classpath:bbb.xml”})
开启事务不回滚
@Transactional
@Rollback(false)
例子
springboot与junit
@SpringBootTest
@RunWith(SpringJUnit4C1assRunner.class)
//让测试用例使用test/resources下自定义配置文件,而不引用main/resources里的properties配置
@TestPropertySource(locations="classpath:application-dbTbMap.properties")
@SpringBootTest(classes = StarterEzampleMain.class)
public class StarterTestDbTbMap {
@Autowired
private OrderService orderService;
@Test
@Transactional
@Rollback
public void test001() {
int insert = orderService.insert();
Assert.assertIrue("the insert is error", insert==1);
}
}
关于@springbootTest配置文件加载说明
1.比如 test/resources/application.yml test/resources/application.properties像这种文件@SpringbootTest会自动去test目录加载
2. 如果原始启动类里面引入了外部配置,如下图所示的一个 原始启动类
这时@SpringBootTest注解引用原始的启动类时 会去main/resources/目录下加载配置
这里 例子中原始启动类为TestClientApplication 外部启动类为 @ImportResource
此时在@SpringBootTest单元测试会优先使用 main/resources/dubbo-consumer.xml和spring-bean.xml
Mock
pom.xml
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<scope>test</scope>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<scope>test</scope>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
<version>依赖springboot父项目版本</version>
</dependency>
引用的注解
@RunWith(PowerMockRunner.class)
@PrepareForTest(SPIExtensionLoader.class)
@RunWith(PowerMockRunner.class)
@PrepareForTest(SPIExtensionLoader.class)
public class BasePo{
}
mock一个spi的静态类接口
IHintAround iHintAround = SPIExtensionLoader.loddExtension(IHintAround.class);
public abstract class BasePo<Textends BasePo> implements Serializable {
private static final long serialVersionuID = 1406072669738004984L;
private static final String BASE_RESULT_MAP = ".resultMap" ;
private static final IHintAround iHintAround = SPIExtensionLoader.loddExtension(IHintAround.class);
public <Textends BasePo> int batchInsertSingleDbTb(List<T> list){
Assert.isTrue( list != null && !list.isEmpty(),"批量插入操作时,List集合不能为空");
Assert.isTrue( iHintAround!=null,"批量插入时, spi前后处理接口未加载到实现类");
for (T po : list) {
preInsert(po);
}
String logicTableName = BasePoHandler.instance.getTableName(list.iterator().next());
try{
iHintAround.doBefore(list.iterator().next(),logicTableName,null,null);
return baseDao.batchInsert(list);
} finally {
iHintAround.doAfter();
}
}
}
现在这样mock他的实现类
//mock
PowerMockito.mockStatic(SPIExtensionLoader.class);
IHintAround iHintAround = Mockito.mock(IHintAround.class);
when(SPIExtensionLoader.loadExtension(IHintAround.class)).thenReturn(iHintAround);//给static final字段反射值
//反射
Field nameField = BasePo.class.getDeclaredField( "iHintAround" );
nameField.setAccessible(true);
Field modifiers = nameField.getClass().getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(nameField,nameField.getNodifiers() &~Wodifier.FINAL);
nameField.set(po, iHintAround);
modifiers.setInt(nameField, nameField.getNodifiers() & ~Modifier.FINAL);
system.out.println("resultSize = " + po.batchInsertSingleDbTb(list));
mock一个枚举
//需要引用这个注解
//@RunWith(PowerockRunner.class)
//@PrepareForTest(DalRegister.class)
DalRegister mockInstance = PowerMockito.mock(DalRegister.class);
Whitebox.setInternalState(DalRegister.class,"instance",mockInstance);
when(mockInstance.getOriginDataShardingMap()).thenReturn(originDataShardingHap);
忽略一些启动报错@PowerMockIgnore()
解决方式为