当前位置: 首页 > 知识库问答 >
问题:

如何调用私有方法来测试它是否有Tuple5参数?

柴亦
2023-03-14

我需要测试来运行该方法。我有这样的课:

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);
}

提前道谢。

共有1个答案

桂志诚
2023-03-14

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项目,我不知道如何测试私有方法。 下面是一个代码示例: 有什么想法吗?