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()

解决方式为
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值