- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习 Java 教程,其中向我介绍了抽象类并使用 J-Unit 进行测试。
我有 2 个文件,AthleteTest 和 BikerTest,其中 BikerTest 扩展了 AthleteTest。AthleteTest 包含我的不同测试的常用方法和变量,而 BikerTest 包含细节。
运动员测试
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public abstract class AthleteTest
{
private Athlete a1;
private Athlete a2;
protected String _name = "Test Athlete";
protected int _age = 32;
protected int _racerId = 987654;
public abstract Athlete getAthlete();
public abstract Athlete getExplicitAthlete();
public AthleteTest()
{
a1 = getAthlete();
a2 = getExplicitAthlete();
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testConstructors()
{
assertNotNull("Default Runner could not be created", a1);
assertNotNull("Explicit Runner could not be created", a2);
assertEquals("Name not set correctly on a2"
, _name
, a2.getName());
assertEquals("Age not set correctly on a2"
, _age
, a2.getAge());
assertEquals("RacerID not set correctly on a2"
, _racerId
, a2.getRacerId());
}
@Test
public void testGetSetName()
{
a1.setName(_name);
assertEquals("The name could not be set as expected"
, _name
, a1.getName());
}
@Test
public void testGetSetAge()
{
a1.setAge(_age);
assertEquals("The age could not be set as expected"
, _age
, a1.getAge());
}
@Test
public void testGetSetRacerId()
{
a1.setRacerId(_racerId);
assertEquals("The racerId could not be set as expected"
, _racerId
, a1.getRacerId());
}
public abstract void testPerformRaceActivity();
@Test
public void testToString()
{
a1.setName(_name);
a1.setAge(_age);
a1.setRacerId(_racerId);
String rts = a1.toString();
assertTrue("To String does not contain name"
, rts.contains(_name));
assertTrue("To String does not contain age"
, rts.contains(String.format("%d", _age)));
assertTrue("To String does not contain racer id"
, rts.contains(String.format("%d", _racerId)));
String rc = a1.getClass().toString();
assertTrue("To String does not contain class"
, rts.contains(rc));
}
}
自行车测试
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class BikerTest extends AthleteTest
{
private Biker r;
private String raceActivity = "Biking";
private boolean usesClips = false;
@Override
public Athlete getAthlete() {
return new Biker();
}
@Override
public Athlete getExplicitAthlete() {
return new Biker(_name,_age,_racerId,usesClips);
}
@Before
public void setUp()
{
r = new Biker();
}
@After
public void tearDown()
{
r = null;
}
@Test
public void testConstructors()
{
super.testConstructors();
Biker r2 = new Biker(_name, _age, _racerId, usesClips);
assertNotNull("Explicit Biker could not be created", r2);
assertEquals("Name not set correctly on R2"
, _name
, r2.getName());
assertEquals("Age not set correctly on R2"
, _age
, r2.getAge());
assertEquals("RacerID not set correctly on R2"
, _racerId
, r2.getRacerId());
assertEquals("UsesClips not set correctly on R2"
, usesClips
, r2.getUsingClips());
}
@Test
public void testGetSetUsingClips()
{
r.setUsingClips(usesClips);
assertEquals("The clips could not be set as expected"
, usesClips
, r.getUsingClips());
}
@Test
public void testPerformRaceActivity()
{
String pra = r.performRaceActivity();
assertTrue("Perform race activity did not contain activity"
, pra.contains(raceActivity));
}
@Test
public void testToString()
{
super.testToString();
r.setName(_name);
r.setAge(_age);
r.setRacerId(_racerId);
r.setUsingClips(usesClips);
String rts = r.toString();
assertTrue("To String does not contain using clips"
, rts.contains(String.format("%b", usesClips)));
assertTrue("To string does not contain performRaceActivity"
, rts.contains(raceActivity));
}
}
现在,虽然我的文件和代码正在运行(它取自所提供的示例),但我无法弄清楚为什么它会运行,因为教程没有详细介绍如何执行测试。
QN1为什么在抽象类 AthleteTest 中需要构造函数?我的理解是,因为它是抽象的,所以不会被实例化,因此不需要构造函数,因为构造函数仅在类被实例化时发挥作用。
QN2测试是如何完成的;测试顺序是什么样的?例如,当我运行 BikerTest 时,虽然我重写了 GetAthlete 和 GetExplicitAthlete 类,但我实际上并没有运行代码中的方法。然而,为什么当我运行代码时,方法却运行了。默认情况下,JUnit 是否只运行所有方法?
QN3当我运行 BikerTest 时,父类(super class) AthleteTest 是如何实例化和工作的?例如,在 BikerTest 中,我调用了 super - 这是 AthleteTest。AthleteTest 是在我调用 super 时实例化/创建的 - 结果对象存储在 a1 和 a2 中,或者它是在某时某处创建的还有吗?
提前感谢您提供的任何澄清和解释!
最佳答案
Why do i need a constructor in the abstract class AthleteTest?My understanding is that because it is abstract, it will not be instantiated
没错。抽象类不能被实例化。虽然,这并不意味着抽象类不能有构造函数。如果您不向类添加构造函数,编译器将为您添加一个默认的无参数构造函数。对于抽象类也是如此。此外,Java 中的每个构造函数都有一个隐式 super()
调用,因为它在第一行调用父类的构造函数(包括编译器添加的默认构造函数)。在您的示例中,BikerTest
没有显式构造函数。因此,编译器会将以下构造函数添加到 BikerTest
类:
public BikerTest() {
super();
}
只要您运行 BikerTest
JUnit
类,JUnit
就会创建一个 BikerTest
类的实例,并且BikerTest
构造函数中的 super()
调用将导致调用 AthleteTest
类的构造函数。
For example,when i run BikerTest, while i override the GetAthlete and GetExplicitAthlete classes, i do not actually run the methods in the code.Yet why is it when i run the code, the methods are run
如前所述,BikerTest
中的 super()
调用导致调用 AtheleteTest
类的无参数构造函数。 AtheleteTest
类调用 getAthlete()
和 getExplicitAthlete()
方法。虽然这些方法是抽象的,但它们已在 BikerTest
类中被覆盖。 BikerTest
类中的方法将被调用,因为创建的对象属于 BikerTest
How is the superclass AthleteTest instantiated and work when i run BikerTest? For example, in BikerTest, i made calls to super - which is AthleteTest.Is AthleteTest instantiated/ created at the point when i make a call to super - and the resulting object is stored in a1 & a2, or is it created somewhen and somewhere else?
没有。使用 super
调用方法或使用 super
访问字段不会导致父类(super class)被实例化(无论它是否是抽象的)。 r
变量在 setUp
方法中分配了一个对象,这是 JUnit
在运行任何测试之前调用的第一个方法。 a1
和 a2
变量在 BikerTest
被实例化并且 AtheleteTest
无参数构造函数被调用时被分配一个对象(如前所述)
关于java - 为什么我需要抽象类中的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30424513/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!