Java 如何对方法调用返回的对象的结构进行单元测试?

Java 如何对方法调用返回的对象的结构进行单元测试?,java,unit-testing,junit,Java,Unit Testing,Junit,我正在尝试对对象的结构进行单元测试,我正在调用方法getResults(),它会返回一个对象的属性,如: 双数学标记、双科学标记、双历史标记,现在如何在我的Junit类中测试返回对象的结构 我有vo其中定义了双数学标记、双科学标记、双历史标记,我不确定如何检查测试类中返回对象的结构?有什么建议吗?因为java是强类型的,而不是动态语言,所以实际上不需要这种类型的测试。您应该有某种ResultClass,它有自己的测试,因此该类的结构将为您进行隐式测试 如果您的方法可以返回子类,那么可以根据输入测

我正在尝试对对象的结构进行单元测试,我正在调用方法
getResults()
,它会返回一个
对象
的属性,如:

双数学标记、双科学标记、双历史标记
,现在如何在我的
Junit
类中测试返回对象的结构


我有
vo
其中定义了
双数学标记、双科学标记、双历史标记
,我不确定如何检查测试类中返回对象的结构?有什么建议吗?

因为java是强类型的,而不是动态语言,所以实际上不需要这种类型的测试。您应该有某种ResultClass,它有自己的测试,因此该类的结构将为您进行隐式测试

如果您的方法可以返回子类,那么可以根据输入测试返回的类是否是正确的类型,但是这些子类应该有自己的单元测试来验证其结构功能


还要注意,如果results类有一个类似于
getScienceMarks
的方法,那么应该根据返回结果的方法的输入来验证返回值是否正确。在这里,您要确保正在测试的类正确执行。它隐式地验证结果类的结构;i、 因为java是强类型的,而不是一种动态语言,所以实际上并不需要这种类型的测试。您应该有某种ResultClass,它有自己的测试,因此该类的结构将为您进行隐式测试

如果您的方法可以返回子类,那么可以根据输入测试返回的类是否是正确的类型,但是这些子类应该有自己的单元测试来验证其结构功能


还要注意,如果results类有一个类似于
getScienceMarks
的方法,那么应该根据返回结果的方法的输入来验证返回值是否正确。在这里,您要确保正在测试的类正确执行。它隐式地验证结果类的结构;i、 在Java中,通常会有一个接口或一个指定所需成员的公共超类。然后可以使用
assertTrue(SomeClass的实例)进行测试。
请注意,即使返回的对象具有所需的成员,但没有实现/扩展SomeClass,此测试也会失败

如果您想/必须使用字段,可以使用反射来检查字段的存在和类型

第三种选择是使用groovy之类的语言进行测试。它将允许您编写访问代码的代码,不管它们是否确实存在。至少我认为这应该是可能的,但因为我从未实际使用groovy,所以我无法提供任何细节


为了选择正确的方法,问题是:客户机代码如何访问字段/成员。您的测试应该使用相同的方法。

在Java中,您通常会有一个接口或一个指定所需成员的公共超类。然后可以使用
assertTrue(SomeClass的实例)进行测试。
请注意,即使返回的对象具有所需的成员,但没有实现/扩展SomeClass,此测试也会失败

如果您想/必须使用字段,可以使用反射来检查字段的存在和类型

第三种选择是使用groovy之类的语言进行测试。它将允许您编写访问代码的代码,不管它们是否确实存在。至少我认为这应该是可能的,但因为我从未实际使用groovy,所以我无法提供任何细节


为了选择正确的方法,问题是:客户机代码如何访问字段/成员。您的测试应该使用相同的方法。

如果我正确理解您的问题,请使用Hamcrest:

MyPojo pojo = ...getResults();
assertThat(pojo, allOf(
    hasProperty("mathMarks", equalTo(123),
    hasProperty("scienceMarks", equalTo(321),
    ...));

hasProperty匹配器验证给定对象是否具有特定的JavaBean属性和给定值(值匹配器是可选的)。

如果我正确理解您的问题,请使用以下命令:

MyPojo pojo = ...getResults();
assertThat(pojo, allOf(
    hasProperty("mathMarks", equalTo(123),
    hasProperty("scienceMarks", equalTo(321),
    ...));

hasProperty匹配器验证给定对象是否具有特定的JavaBean属性和给定的值(值匹配器是可选的)。

你说的“检查结构”是什么意思?关于返回的对象,你到底想知道什么?@Anthony-我是单元测试新手,所以我想检查该对象是否包含我正在查找的所有属性,所以我说是结构,因为我不确定是否要将其输出。如果你调用一个返回VO类实例的方法,它可以返回VO类的一个实例(您可以确定它将包含VO类的所有实例变量/字段/属性[无论您想调用它们什么]),而无需显式测试)或者
null
@Anthony那么你是说没有必要对
MarketData
的结构进行测试?你说的“检查结构”是什么意思?关于返回的对象,你到底想知道什么?@Anthony-我是单元测试新手,所以我想检查该对象是否包含我正在查找的所有属性,所以我说是结构,因为我不确定是否要将其输出。如果你调用一个返回VO类实例的方法,它可以返回VO类的一个实例(您可以确定它将包含VO类的所有实例变量/字段/属性[无论您想调用它们什么]),而无需显式测试)或者
null
@Anthony那么你是说没有测试
MarketData
结构的点吗?测试
assertTrue(某个类的实例)
是吗