项目用的是maven,所需jar包在pom.xml文件里面配置,单元测试要用的jar具体以下:java
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency>
从上面的jar包能够看到,此次主要用了Junit mock 和 spring-test.spring
具体的构建项目这里就很少说了,接下来咱们直接看下testBean里面的具体代码应用:数据库
具体类:dom
package com.lcc.parser; import com.lcc.dto.RatingTagFieldDto; import com.lcc.rating.RatingTagField; import java.util.ArrayList; import java.util.List; public final class RatingTagFieldDtoParser { public static List<RatingTagFieldDto> fromRatingTagFieldList(List<RatingTagField> ratingTagFieldList) { if (ratingTagFieldList == null) { return new ArrayList<>(); } List<RatingTagFieldDto> resultList = new ArrayList<>(); for (RatingTagField ratingTagField : ratingTagFieldList) { RatingTagFieldDto ratingTagFieldDto = new RatingTagFieldDto(); ratingTagFieldDto.setId(ratingTagField.getId()); ratingTagFieldDto.setKey(ratingTagField.getKey()); resultList.add(ratingTagFieldDto); } return resultList; } }
测试类:maven
package com.opentrans.otms.core.infrastructure.service.impl.xtt.rmi.parser; import com.lcc.dto.RatingTagFieldDto; import com.lcc.rating.RatingTagField; import com.opentrans.lcc.rating.RatingTagFieldRepository; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; import java.util.List; import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class RatingTagFieldDtoParserTest { @Mock private RatingTagFieldRepository ratingTagFieldRepository; @Before public void doBefore() { List<RatingTagField> ratingTagFields = mockRatingTagField(); when(ratingTagFieldRepository.findActiveTags()).thenReturn(ratingTagFields); } @Test public void testFromTatingTagFieldList() { List<RatingTagField> ratingTagFields = ratingTagFieldRepository.findActiveTags(); List<RatingTagFieldDto> ratingTagFieldDtos = RatingTagFieldDtoParser.fromRatingTagFieldList(ratingTagFields); RatingTagFieldDto ratingTagFieldDto = ratingTagFieldDtos.get(0); Assert.assertEquals(ratingTagFieldDto.getId(), Long.valueOf(111)); Assert.assertEquals(ratingTagFieldDto.getKey(), "asdfghjkl"); } private List<RatingTagField> mockRatingTagField() { List<RatingTagField> ratingTagFields = new ArrayList<>(); RatingTagField ratingTagField = new RatingTagField(); ratingTagField.setId(111L); ratingTagField.setKey("asdfghjkl"); ratingTagField.setActive(true); ratingTagFields.add(ratingTagField); return ratingTagFields; } }
上面的@RunWith注解咱们还能够用springJunit4下面的class,只要咱们的项目是支持spring的,就能够用
SpringJUnit4ClassRunner.class,可是若是咱们用的是SpringJUnit4ClassRunner.class,就必需要加上@ContextConfiguration注解,指向xml文件;
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("ConnectionEventMailTest-context.xml")
若是对mock不理解的能够去看一下官方文档;工具
关于MockitoJUnitRunner.class 和 SpringJUnit4ClassRunner.class 的区别:单元测试
Mock下面的类不与数据库进行数据交互,测试类里面的数据是咱们纯mock出来的,测试
而spring下面的类是能够与数据库进行数据交互的,若是咱们要进行数据交互就必须指向xml进行数据库链接。spa
这两个的具体应用要看咱们所要写的test类是否须要进行数据库数据交互。code
号外号外!!!
若是咱们的javabean里面的属性是private修饰的,并且尚未get set方法(例如id,若是咱们考虑的是自增加或者使用sequnce,咱们是不支持对id进行set的),
测试的时候又须要用到id,该怎么办呢?
咱们能够用java给咱们提供的映射去操做,这个类是Field,在java.lang.reflect下面。
接下来看下具体的代码实现,这段代码是一个工具类下面的一个方法,去给一个class set id;
public static void setDomainId(Class<?> clazz, Object domain, String key, Object value, boolean isSupperField) { try { if (isSupperField) { clazz = clazz.getSuperclass(); } Field field = clazz.getDeclaredField(key); field.setAccessible(true); field.set(domain, value); } catch (Exception e) { e.printStackTrace(); } }
除了id,其余属性也能够用这个,原理是同样的。
reflectionset get 方法
public static <T> void reflectionSet(Class<? super T> clazz, T obj, String name, Object value) { Field field = null; while (!Object.class.equals(clazz)) { try { field = clazz.getDeclaredField(name); break; } catch (NoSuchFieldException e) { clazz = clazz.getSuperclass(); } } try { field.setAccessible(true); field.set(obj, value); } catch (Exception e) { throw new RuntimeException(e); } } public static <T, R> R reflectionGet(Class<? super T> clazz, T obj, String name) { Field field = null; while (!Object.class.equals(clazz)) { try { field = clazz.getDeclaredField(name); break; } catch (NoSuchFieldException e) { clazz = clazz.getSuperclass(); } } try { field.setAccessible(true); return (R) field.get(obj); } catch (Exception e) { throw new RuntimeException(e); } }