Junit+Mock單元測試

項目用的是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);
        }
    }
相關文章
相關標籤/搜索