0

我在 JUnit 中对相同的测试有不同的结果。第一个测试似乎没问题,为了验证所有断言,我相信该类工作正常。然后我重新运行测试,我得到一个断言失败。我意识到问题是我在测试后没有清除“数据”,我试图修复它,但我仍然遇到这些断言失败。

有任何想法吗?

单元测试:

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * The test class TestHistorial.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class TestHistorial extends junit.framework.TestCase {
    Historial hist;

    /**
     * Default constructor for test class TestHistorial
     */
    public TestHistorial() {
    }

    /**
     * Sets up the test fixture.
     * <p/>
     * Called before every test case method.
     */
    @Before
    public void setUp() {
        hist = new BaseDatos();
    }

    /**
     * Tears down the test fixture.
     * <p/>
     * Called after every test case method.
     */
    @After
    public void tearDown() {
        hist.eliminarTodosLosRegistros();
    }

    /**
     * Prueba
     */

    public void testHistorial() {

        for (int i = 0; i < 20; i++) {
            Registro reg = new RegistroTemperatura(273 + i, 1900 + i, i + 1, i + 1, i);
            try {
                hist.agregarRegistro(reg);
            } catch (Exception e) {
                assertEquals(false, true);
            } // No debería llegar aquí.
            String str = "Reg_" + i;
            Registro tReg = hist.getRegistroPorId(str);
            try {
                Temperatura t = new Temperatura(273 + i);
                assertEquals(true, t.equals(((RegistroTemperatura) tReg).getTemperatura()));
            } catch (Exception e1) {
                assertEquals(false, true);
            } // No debería llegar aquí.
            try {
                Fecha f = new Fecha(1900 + i, i + 1, i + 1, i);
                assertEquals(true, f.equals(tReg.getFecha()));
            } catch (Exception e2) {
                assertEquals(false, true);
            } // No debería llegar aquí.
        }
        assertEquals(20, hist.getNumeroDeRegistros());
        assertEquals(true, hist.getRegistroMasViejo().equals(new RegistroTemperatura(273, 1900, 1, 1, 0)));

    }
}

第一次测试后的测试输出是:

$> 预期:假但原为:真

真正的问题是,该tearDown()方法是在 `testHistorial()` 之后执行的吗?如果不是,我该怎么做?

4

1 回答 1

2

首先,不要使用任何低于 4.0 的 JUnit 版本。 其次,不要在junit.framework.*or中使用任何东西junit.extensions.*

有了这个...

要回答第一个问题,在 JUnit 4.x 中,您的@After-annotated 方法总是在您的测试用例执行之后执行。

要解决问题的实质……您的单元测试应该测试一件事。它们只是一个功能单元。现在,您正在测试至少五个不同的部分,这就是为什么要理解正在发生的事情或者为什么它会崩溃是很复杂的。

一点一点:测试Registro并确信它正在做它应该做的事情。然后继续前进Historial。然后继续前进Temperatura。然后Fecha。我无法具体告诉您为什么它会给您带来不一致的断言失败,但我可以告诉您,很难理解您实际测试的内容,这可能是造成误解的原因。

此外,作为一般建议 - 如果您正在捕获Exception,请考虑仅在测试中捕获它,如果它是已检查异常(由 Java 强制执行),或者如果您需要它抛出异常并需要在异常之后断言有关状态的事情被抛出。

于 2013-06-17T02:43:45.427 回答