Как сделать так, чтобы у класса jUnit был параметр - PullRequest
0 голосов
/ 24 ноября 2018

У меня проблема с передачей класса bean-компонента, такого как mvc, для реализации в классе jUnit.Я не хочу менять структуру класса jUnit, потому что он мне нужен.

Класс DataBean

public class DataBean {
    private String browserName;
    private String userName;

    public String getBrowserName() {
        return browserName;
    }

    public void setBrowserName(String browserName) {
        this.browserName = browserName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

Класс Main

public class Main {
    public static void main(String[] args) {
        String[] arrBrowserName = {"chrome", "firefox"};
        String[] arrUserName = {"user1", "user2"};

        for(int i=0; i<2; i++) {
            DataBean dataBean = new DataBean();

            String browserName = arrBrowserName[i];
            String userName = arrUserName[i];

            dataBean.setBrowserName(browserName);
            dataBean.setUserName(userName);

            //How to call "TestCase1", include passing the "databean"
            JUnitCore junit = new JUnitCore();
            junit.run(TestCase1.class);
        }
    }
}

Класс TestCase1

public class TestCase1 {
    DataBean dataBean = new DataBean();

    //Here, how to do ? i want to get "databean" from "Main" class, without change this is class as jUnit

    @Before
    public void setUp(){
        //set up based on data from "Main class"
    }

    @Test
    public void scenario(){
        //
    }

    @After
    public void tearDown(){
        //
    }
}

Исходя из приведенного выше кода, скажем, у меня есть 2 данные для тестирования данных, я хочу настроить before на основе данных из основного класса.Где я размещаю параметр в TestCase1, чтобы я мог получить databean?и возможно ли это?

1 Ответ

0 голосов
/ 24 ноября 2018

К вашему сведению, объект DataBean - это запах, называемый anemic object.

Это DTO (объект для передачи данных), поэтому, за исключением случаев, когда это требуется какой-либо средой, старайтесь сохранить этинеизменным, или, по крайней мере, сделайте его явным, что нет инкапсуляции:

public class DataBean {
    public String browserName;
    public String userName;
}

В любом случае, кажется, что вы пытаетесь параметризовать тест.

Учитывая, что тестовый объект создаетсяJUnit, вам придется изменить тестовый класс, используя API, предоставленный JUnit, чтобы внедрить необходимый объект / данные.

Вы можете использовать хранилище ThreadLocal для обхода API-интерфейса платформы, но я его вообще не рекомендую.

Если вы используете JUnit, сделайте это способом JUnit.

Предполагая, что вы все еще используете JUnit4, вы можете пойти (как минимум) двумя путями:

Первый , используя встроенный бегун JUnit4 Parameterized, делая тестовый класс параметризованным:

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class BrowserTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {new DataBean("chrome", "user1")},
                {new DataBean("firefox", "user2")}
        });
    }

    private final DataBean dataBean;

    public BrowserTest(DataBean dataBean) {
        this.dataBean = dataBean;
    }

    @Test
    public void test() {
        // Test using a dataBean instance
    }
}

Второй ,используйте третью библиотеку под названием JUnitParams с бегуном JUnitParamsRunner, макороль метод тестирования параметризованный:

import org.junit.Test;
import org.junit.runner.RunWith;

import junitparams.JUnitParamsRunner;
import junitparams.Parameters;

@RunWith(JUnitParamsRunner.class)
public class BrowserTest {

    @Test
    @Parameters(method = "test_cases")
    public void test(DataBean dataBean) {
        // Test using a dataBean instance
    }

    public static Object[] test_cases() {
        return new Object[]{
                new DataBean("chrome", "user1"),
                new DataBean("firefox", "user2")
        };
    }
}

Наконец , есть новая версия, JUnit5 , которая сильно меняется в зависимости от его модели расширенияпоскольку он позволяет составлять функции (вместо одного бегуна).

С JUnit5 такой же тест можно написать так:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

class BrowserTest {

    @ParameterizedTest
    @CsvSource({
        "chrome, user1",
        "firefox, user2"
    })
    void test(String browserName, String userName) {
        // Test using a dataBean instance
    }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...