我有一个界面
public interface Triangle {
int X1();
int Y1();
int X2();
int Y2();
int X3();
int Y3();}
包含返回6个整数的方法,这些整数是笛卡尔坐标系中直角三角形的三个顶点的坐标。 我有一个返回直角三角形的方法:
public final class RtriangleProvider {
public static Rtriangle getRtriangle() {
}
}
我应该编写代码一个junit测试方法getRtriangle,他确实返回了一个直角 三角形。 这是我的UnitTest:
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class RtriangleProviderTest{
@Test
public void Test(){
Rtriangle test = RtriangleProvider.getRtriangle();
assertNotNull("The input data are not available", test);
double a = Math.sqrt(Math.pow((test.getX1()-test.getX2()),2)+(int)Math.pow((test.getY1()-test.getY2()),2));
double b = Math.sqrt(Math.pow((test.getX2()-test.getX3()),2)+(int)Math.pow((test.getY2()-test.getY3()),2));
double c = Math.sqrt(Math.pow((test.getX1()-test.getX3()),2)+(int)Math.pow((test.getY1()-test.getY3()),2));
assertTrue ("The sum of two sides is less than the third, not the triangle",a < b + c && b < c + a && c < a + b);
assertTrue("Not rectangle triangle in accordance with Pythagorian theorem",((int)Math.pow(a,2)==(int)Math.pow(b,2)+(int)Math.pow(c,2))||
((int)Math.pow(b,2) == (int)Math.pow(a,2)+(int)Math.pow(c,2))||
((int)Math.pow(c,2) == (int)Math.pow(b,2)+(int)Math.pow(b,2))
);
}
}
我认为,我的测试并不完整。请告诉我我的考试有什么问题
答案 0 :(得分:0)
嗯,这可能不是你想听的,但我认为所有的计算必须放在三角形对象中。所以你最终会得到类似的东西:
public interface Triangle {
int X1();
int Y1();
int X2();
int Y2();
int X3();
int Y3();
double a();
double b();
double c();
boolean isTheSumOfSidesLessThanAThird();
boolean isATriangleInAccordancePythagorianTheorem();
}
在重构三角形类之后,我会整理断言:
// Given...
Rtriangle test = RtriangleProvider.getRtriangle();
// When and Then...
assertThat(test, isNotNullValue());
assertThat(test.isTheSumOfSidesLessThanAThird(), isTrue());
assertThat(test.isATriangleInAccordanceWithPythagorianTheorem(), isTrue());
我认为计算方法断言边的总和是否为&lt;而不是第3个,如果三角形是Pythagorian属于三角形本身,那么我将从将这些方法移动到三角形类开始。
你应该避免在测试本身中保留复杂的逻辑(例如这些计算),因为你在编写测试代码时可能会犯错误,并且根据你犯了什么错误,虽然它断言错误,但测试会通过飞扬的颜色传递值。在某些情况下,您无法避免在测试中编写复杂的逻辑,但您必须尽一切可能避免陷入这些情况。
我不知道这个 RTriangleProvider 类是如何工作的,但你应该能够模拟它的行为,以便它为X和Y设置已知值,因此你会知道在调用时会发生什么em> a(), b(), c(), isTheSumOfSidesLessThanAThird()和 ismriangleInAccordanceWithPythagorianTheorem()< / em>的
请记住: