gpt4 book ai didi

java - 当测试按设置运行时,单元测试失败?

转载 作者:行者123 更新时间:2023-12-01 08:57:00 25 4
gpt4 key购买 nike

Link to repo

我正在学习 Java 单元测试,并为一些算法编写了一些单元测试。

当我单独运行单元测试时,它们很好地通过,但是当我作为一组运行它们时,只有第一个通过,其余的都失败。

例如,Test1、Test2、Test3作为一组运行;然后 Test1 通过,Test2 和 Test3 失败。

如果我注释掉 Test1 的代码,然后运行 ​​Test2 和 Test3; Test2 通过,Test3 失败。

当我单独运行它们时,它们都通过了。

算法代码:

package com.kbajpai.algorithms.ds;

class Node {
private static Node sInstance;

static {
try {
sInstance = new Node();
} catch (Exception e) {
throw new RuntimeException("Could not create singleton instance");
}
}

static Node getInstance() {
return sInstance;
}

private long mData;
private int mCount;
private Node mLeft;
private Node mRight;

private Node() {
mCount = 0;
mLeft = null;
mRight = null;
}

private Node(long data) {
mData = data;
mLeft = null;
mRight = null;
mCount = 1;
}

public String toString() {
StringBuilder sb = new StringBuilder();

if (mCount == 0) {
return "";
} else {
if (mLeft != null) {
sb.append(mLeft.toString()).append(",");
}
sb.append(mData).append(":").append(mCount);
if (mRight != null) {
sb.append(",").append(mRight.toString());
}
}
return sb.toString();
}

private void insert(long data) {
if (mCount == 0) {
mData = data;
mCount++;
} else {
if (data == mData) {
mCount++;
} else if (data > mData) {
if (mRight != null) {
mRight.insert(data);
} else {
mRight = new Node(data);
}
} else {
if (mLeft != null) {
mLeft.insert(data);
} else {
mLeft = new Node(data);
}
}
}
}

String getScores(long[] data) {
for (long aData : data) {
insert(aData);
}

return toString();
}
}

单元测试代码:

package com.kbajpai.algorithms.ds;

import com.kbajpai.datagen.ds.ScoreStatsData;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

import static junit.framework.TestCase.assertTrue;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class NodeTest {
@Test
public void test01ScoreStats_Ten() throws Exception {
long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_TEN);
String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_TEN_STATS);

assertTrue(expected.equals(Node.getInstance().getScores(data)));
}

@Test
public void test02ScoreStats_Hundred() throws Exception {
long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_HUNDRED);
String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_HUNDRED_STATS);

String actual = Node.getInstance().getScores(data);
assertTrue(expected.equals(actual));
}

@Test
public void test03ScoreStats_Thousand() throws Exception {
long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_THOUSAND);
String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_THOUSAND_STATS);

String actual = Node.getInstance().getScores(data);
assertTrue(expected.equals(actual));
}

@Test
public void test04ScoreStats_Million() throws Exception {
long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_MILLION);
String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_MILLION_STATS);

String actual = Node.getInstance().getScores(data);
assertTrue(expected.equals(actual));
}

@Test
public void test05ScoreStats_TenMillion() throws Exception {
long[] data = ScoreStatsData.getInstance().getNumbers(ScoreStatsData.FILE_TEN_MILLION);
String expected = ScoreStatsData.getInstance().getStats(ScoreStatsData.FILE_TEN_MILLION_STATS);

String actual = Node.getInstance().getScores(data);
assertTrue(expected.equals(actual));
}
}

注意:

最佳答案

这是由于您使用具有持久状态的静态变量造成的。第一个测试运行时,它将一些数据放入单例对象中,并且当第二个和后面的测试在同一批处理中运行时,该数据仍然存在。

要解决此问题,您需要在每次测试之间重置单例,或者重写代码以首先不使用单例模式。

关于java - 当测试按设置运行时,单元测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987478/

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