項目用的是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); } }