Junit4.12 + powermock + Метод испытание статического, обычные методы, частные методы фиктивного блока

Прежде всего, позвольте мне процитировать некоторые из языка великого Бога, чтобы объяснить роль макете модульного тестирования.

Ссылка блог: всемогущий PowerMock, фиктивные частные методы, статические методы, тестовые частные методы, конечные классы

1, почему издеваться

У меня есть книга, чтобы объяснить:

  (1) создать необходимые данные DB может занять много времени, такие как: вызов других интерфейсов для имитации много данных

  (2) вызова интерфейса API сторонних производителей, тест очень медленно,

  (3) подготовка теста для удовлетворения всех внешних зависимости могут быть сложными, комплекс не стоит писать, Мок моделировать внутреннюю или внешнюю зависимость, которые могут помочь нам решить эти проблемы

Другая интерпретация этой книги TDD:

  Результаты (1) объект неопределенности, так как каждый из них получает текущее время, результаты не совпадают, а не в соответствии с нашими ожиданиями;

  Объекты (2) реализация этого интерфейса не существует;

  (3) низкая скорость объекта

  Ибо есть более важная причина TDD: с помощью моделирования можно выделить все полагаются на текущие методы, используемые, давайте больше сосредоточиться на одном устройстве, не обращая внимания на внутреннюю работу своего вызывающего кода

Блог сухих грузов:

  (1) Пробный тест объект может быть использован, чтобы поднять зависимость от внешних услуг (например, баз данных, интерфейс третьих лиц и т.д.), так что тест может выполняться независимо друг от друга. Независимо от традиционных монолитных приложений или ныне популярных микро-услуг, этот пункт особенно важен из-за наличия каких-либо внешних зависимостей будут строго ограниченные тестовые случаи могут мигрировать и стабильности.

  Второе преимущество (2) Тестовая модель была заменена на внешние вызовы служб, улучшить скорость тестирования. Любой внешний вызов службы, по крайней мере потребления кросс-процесс уровня, даже в различных системах, потребление по сети, и Ложная может сократить потребление в процесс. На втором этапе, такие как оригинальные сетевые запросы, может быть уменьшена на Mock миллисекунд, полный три порядка величины разности.

  (3) Третье преимущество Ложная заключается в повышении эффективности тестирования. Вот что эффективность теста имеет два значения. Первый слой смысла этого число тестов для запуска единицы времени, что является прямой выгодой работать быстрее приносит. Второе значение является числом тестов единицы тестер времени создания.

  Мономер применение, например, с ростом бизнеса сложности, для того, чтобы запустить тест, возможно, потребуется подготовить много тестовых данных, тестовые данные, в то же время также стремиться к тому, чтобы без помех между несколькими тестовыми. Чтобы сделать это, тестеры часто приходится тратить много времени, чтобы поддерживать набор тестовых данных, которые могут быть запущены. После того, как с притворной, в связи с базой данных зависимостей удаления общего между тестом, тестер может создать отдельный набор тестовых данных для каждого или каждого набора тестов, так что это легко сделать между различными тестовыми выделение данных. Для микро-услуг, как микро-сервис может зависеть от многих других микро обслуживания каскада, запустить тест, даже нужно подготовить набор тестовых данных между системами, если не Мок, в основном можно сказать, невозможно. Поэтому, будь то отдельное приложение или микро-услуги, прибытие Мок, QE позволит сэкономить много времени для подготовки тестовых данных, тестовые примеры сосредоточиться на себе, естественным образом повысить эффективность одного теста.

Может не издеваться статические, конечные, частные методы: Mock более популярные инструменты, такие как JMock, EasyMock, Mockito другие имеют общий недостаток, в настоящее время. Инструмент PowerMock Mock может быть меньше трех совершена составляет более

2, бой:

В самом процессе, макет версия является то , что я провел день ямки единственным применение решения , которое я Али облако Maven, powermock некоторых блог зависимости зависит не заходите, после нескольких попыток, только чтобы решить эту проблему. Вот код.
Ссылка блог: конфигурация PowerMock + Junit4 Maven

  <!--mock测试-->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>${powermock-version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>${powermock-version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-core</artifactId>
    <version>${powermock-version}</version>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4-rule</artifactId>
    <version>${powermock-version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

Класс Test содержит обычные вызовы методов, статические методы, частные методы.

package com.testmock;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest(UserController.class)
public class LastMock {
    @Mock
    private UserServiceImpl serviceImpl;

    @InjectMocks
    private UserController controller;

    /**
     * mock service的保存方法
     */
    @Test
    public void mockSave() {
        User user1 = new User();
        User user2 = new User();
        user1.setId("1");
        user2.setId("2");
        Mockito.when(serviceImpl.save(user1)).thenReturn(user2); //当调用service的save()时,mock让他返回user2
        User saveUser = controller.saveUser(user1); //调用
        Mockito.verify(serviceImpl,Mockito.times(1)).save(user1);//verify验证mock次数
        assertEquals(user2, saveUser);//断言是否mock返回的是user2
    }

    /**
     * mock spy public方法
     * @throws Exception xx
     */
    @Test
    public void spy_public_method() throws Exception {
        UserController spy = PowerMockito.spy(controller); //监视controller的publicCheck方法,让他返回true
        Mockito.when(spy.publicCheck()).thenReturn(true);
        String name = spy.getPrivateName("ljw");//执行该方法
        assertEquals("public 被mock 了", name);//验证
    }

    /**
     * mock私有方法
     * @throws Exception xx
     */
    @Test
    public void spy_private_method() throws Exception {
        UserController spy = PowerMockito.spy(controller);
        PowerMockito.when(spy, "check", any()).thenReturn(true);//私有方法mockito不行了,需要用无所不能的PowerMock监视spy
        String name = spy.getPrivateName("ljw");
        assertEquals("private 被mock 了", name);
    }

    /**
     * mock 静态方法
     */
    @Test
    public void mockStaticMethod() {
        PowerMockito.mockStatic(UserController.class);//mock静态方法
        when(UserController.getStaticName(any())).thenReturn("hi");
        String staticName = UserController.getStaticName("ljw");//执行
        assertEquals("hi", staticName);//验证
    }

    @Test
    public void mockStaticMethod_2() {
        PowerMockito.mockStatic(UserController.class);
        when(UserController.getStaticName(any())).thenReturn("hi");
        String staticName = controller.returnName();//通过returnName()调用,看能否被mock
        assertEquals("hi", staticName);
    }

    /**
     * 测试私有方法一
     * @throws InvocationTargetException xx
     * @throws IllegalAccessException xx
     */
    @Test
    public void testPrivateMethod() throws InvocationTargetException, IllegalAccessException {
        Method method = PowerMockito.method(UserController.class, "say", String.class);
        Object say = method.invoke(controller, "hi");
        assertEquals("ljw say hi", say);
    }

    /**
     * 测试私有方法二
     * @throws Exception xx
     */
    @Test
    public void testPrivateMethod_2() throws Exception {
        Object say = Whitebox.invokeMethod(controller, "say", "hi");
        assertEquals("ljw say hi", say);
    }

}

UserController

public final class UserController {

    private final UserServiceImpl service;

    public UserController(UserServiceImpl service) {
        this.service = service;
    }

    public User saveUser(User user) {
        User save = service.save(user);
        return save;
    }

    public String returnName(){
       return getStaticName("ljw1");
    }

    public static String getStaticName(String name) {
        return "A_" + name;
    }
    public  String getPrivateName(String name) {

        if (publicCheck()){
            return "public 被mock 了";
        }
        if (check(name)){
            return "private 被mock 了";
        }
        return "A_" + name;
    }

    public boolean publicCheck() {
        return false;
    }

    private boolean check(String name) {
        return false;
    }

    private String say(String content) {
        return "ljw say " + content;
    }

}

UserServiceImpl


public class UserServiceImpl {
    public User save(User user) {
        return user;
    }
}

пользователь

public class User {
    private String id;
    //省略set/get
}

рекомендация

отwww.cnblogs.com/sean-zeng/p/12370831.html