我需要测试来运行该方法。我有这样的课:
public class MyClass {
private void myClassMethod(Tuple5<List<Index>, List<Category>, Optional<Category>, List<CategoryIndex>, List<TopIndex>> objects) {
List<Index> indexes = objects.getT1();
List<Category> categories = objects.getT2();
Optional<Category> defaultCategory = objects.getT3();
List<CategoryIndex> categoryIndexes = objects.getT4();
List<TopIndex> topIndexes = objects.getT5();
}
我不能改变这门课。我不能将方法的可见性从private更改为public或向类中添加另一个方法。这门课不让我写一个字。
所以我写了这个测试:
// here are some mocks...
@InjectMocks
private MyClass myClass;
@Test
public void testMyClassMethod() throws Exception {
Class[] cArg = new Class[1];
cArg[0] = Tuple5.class;
Method method = MyClass.class.getDeclaredMethod("myClass", cArg);
method.setAccessible(true);
List<Index> indexList = new ArrayList<>();
List<Category> categoryList = new ArrayList<>();
Optional<Category> categoryOptional = Optional.empty();
List<CategoryIndex> categoryIndexList = new ArrayList<>();
List<TopIndex> topIndexList = new ArrayList<>();
Quintet<List<Index>, List<Category>, Optional<Category>, List<CategoryIndex>, List<TopIndex>>[] arr = new Quintet[1];
arr[0] = Quintet.with(indexList, categoryList, categoryOptional, categoryIndexList, topIndexList);
method.invoke(myClass, arr);
}
提前道谢。
Java名义上是类型化的。事物的类型完全由它的名称决定,它的结构与任何事情都没有关系。
那是什么意思?
它意味着:
class Gun {
void shoot(Person p) {
...
}
}
还有这个:
class Camera {
void shoot(Person p) {
...
}
}
就像枪和奶奶一样相关,也就是一点也不相关。
interface Shooter {
void shoot(Person p) { ... }
}
而java就是不允许这样做。这是行不通的:
Shooter s = new Camera(); // nope
我选了'gun'和'camera'当然是故意的:它说明了为什么java是这样的。Java采取的立场是同音异义词(相同的词,不同的意思)的概念是一个东西。许多语言,比如javascript和python,都忽略了同音异义是一个东西的想法。
Java通过要求package语句来避免同音异义。事物的完整“名称”包括方法的名称、它所在的类型的名称以及它所在的包,这时同音异义(在java worldview中)已经被消除。com.smithandwesson.gun.shoot(Person p)
在JavaLand中具有单数含义;它可以与任何其他名为com.smithandwesson.gun.shoot(Person p)
*的东西互换。
对于Tuple5
类型的参数,只能传递从new Tuple5()
派生的对象,或者从new X()
派生的对象,其中X是作为Tuple5的子类型的某个具体类型;它被定义为公共类X扩展Tuple5
,或者公共类X实现Tuple5
,或者公共类X扩展/实现Y
,其中Y扩展/实现Tuple5或其某些子类型。
另外,也没有办法告诉Java:是的,是的,是的。别这么担心了。把我的枪当成照相机!
*)并不是这样;类加载器也会考虑到这一点,但这基本上是正确的。
有没有任何变通办法来直接测试那些方法而不公开它们?
我有以下代码 我对嘲笑不熟悉。我有以下疑问。我正在尝试测试公共方法。 我是否可以断言私有变量workDone的值? 是否可以验证超类中的方法调用? 如何在方法中模拟私有方法调用?
我有一个角度服务公开了一个公共方法。在它的主体中,可以根据条件调用两个不同的私有方法 如何根据传递给公共方法的输入参数,与jasmine一起检查是否调用了一个或另一个方法?我知道我们不应该测试私有方法,但实际上在这里我只想验证公共方法是否调用了正确的私有方法。我不想公开私有方法,因为我只希望服务提供一个访问点。 我的服务方式: } 茉莉花试验: });
公共方法getA()的测试按预期工作,但私有方法getB()的测试不返回模拟值“b”,而是返回与方法getB()的实际返回值相对应的“b”。必须如何调整对getB()的测试,以便返回模拟值“b”?
我使用的是JMockit1.1,我所要做的就是调用一个私有方法并测试返回值。然而,我很难从JMockit去封装示例中准确理解如何做到这一点。
我有一个Angular 11项目,我不知道如何测试私有方法。 下面是一个代码示例: 有什么想法吗?