gpt4 book ai didi

java - 如何让jUnit类有参数

转载 作者:行者123 更新时间:2023-12-02 01:47:59 24 4
gpt4 key购买 nike

我在传递像 mvc 概念这样的 bean 类来实现 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;
}
}

主类

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);
}
}
}

类测试用例1

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 个数据作为数据测试,我想根据 Main 类的数据设置 before 。我将参数放置在 TestCase1 中的哪里以便我可以获得 databean ?这可能吗?

最佳答案

仅供引用,DataBean 对象是一种称为贫血对象的味道。

它是一个 DTO(传输数据的对象),因此除非某些框架需要,否则请尝试保持这些不可变,或者至少明确表明没有封装:

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

无论如何,您似乎正在尝试参数化测试。

鉴于测试对象是由 JUnit 构建的,您必须使用 JUnit 提供的 API 更改测试类以注入(inject)所需的对象/数据。

你可以使用ThreadLocal存储来绕过框架API,但我根本不推荐它。

如果您使用 JUnit,请按照 JUnit 的方式进行操作。

假设您仍然使用 JUnit4,您可以(至少)采用两种方法:

首先,使用 JUnit4 内置运行器参数化,使测试类参数化:

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
}
}

希望这有帮助!

关于java - 如何让jUnit类有参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53461112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com