Java 针对以下场景的Junit测试

Java 针对以下场景的Junit测试,java,junit,testcase,Java,Junit,Testcase,考虑下面的类 public class Validator { boolean startValiadation(UserBean user){ //This method is visible inside this package only return validateUser(user); } private static boolean validateUser(UserBean us

考虑下面的类

public class Validator {

    boolean startValiadation(UserBean user){  
        //This method is visible inside this package only        
        return validateUser(user);           
    }

    private static boolean validateUser(UserBean user){
        //This method is visible inside this class only  
        boolean result=false;
        //validations here
        return result;
    }
}

由于上述方法的安全性要求,我以上述方式编写了代码。现在我想使用Junit编写测试用例。但是,通常情况下,单元测试旨在实现类或单元的公共接口。我仍然可以使用
反射
来做一些我在这里期待的事情。但我想知道有没有其他方法可以实现我的目标

否您只有三种选择来测试私有方法:

  • 如果您控制着代码,那么将访问说明符更改为public只是为了测试该方法
  • 否则使用反射
  • 这可能是您感兴趣的:


    三,。使用公共方法测试私有方法。

    否您只有三种选择来测试私有方法:

  • 如果您控制着代码,那么将访问说明符更改为public只是为了测试该方法
  • 否则使用反射
  • 这可能是您感兴趣的:


    三,。使用公共方法测试您的私有方法。

    您不需要反射。只需将测试类与这个类放在同一个包中。它不需要在同一个文件夹或同一个项目中才能执行此操作。

    您不需要反射。只需将测试类与这个类放在同一个包中。它不需要在同一个文件夹或同一个项目中才能做到这一点

    但是,通常情况下,单元测试旨在实现类或单元的公共接口

    嗯,我对这一点不太武断。我发现,如果你愿意成为“白盒子”,并测试非公共成员,通常你可以获得更好的测试深度。尽管有一个滑动比例-直接测试私有成员相对来说比较难看,但是您可以轻松地测试包私有方法,只需确保您的测试与类位于同一个包中

    (这种方法还鼓励包私有类——我发现,如果您严格地只测试公共API,那么您通常会养成将所有类和许多方法公开的习惯,而实际上它们应该是包私有的。)

    在这种情况下,我建议您通过
    startValidation
    方法进行测试。目前,它调用
    validateUser
    ,但忽略了结果——我假设在实际代码中,它调用了方法,并对结果进行了一些有用的处理,这在测试中是可见的。在这种情况下,您可以使用各种不同的
    User
    对象调用
    startValidation
    ,并断言哪些对象应该有效

    但是,通常情况下,单元测试旨在实现类或单元的公共接口

    嗯,我对这一点不太武断。我发现,如果你愿意成为“白盒子”,并测试非公共成员,通常你可以获得更好的测试深度。尽管有一个滑动比例-直接测试私有成员相对来说比较难看,但是您可以轻松地测试包私有方法,只需确保您的测试与类位于同一个包中

    (这种方法还鼓励包私有类——我发现,如果您严格地只测试公共API,那么您通常会养成将所有类和许多方法公开的习惯,而实际上它们应该是包私有的。)


    在这种情况下,我建议您通过
    startValidation
    方法进行测试。目前,它调用
    validateUser
    ,但忽略了结果——我假设在实际代码中,它调用了方法,并对结果进行了一些有用的处理,这在测试中是可见的。在这种情况下,您可以使用各种不同的
    User
    对象调用
    startValidation
    ,并断言哪些对象应该有效。

    不要单独测试此类。单元测试,至少在Kent Beck设想的TDD精神下,不是针对单个类或方法的测试,而只是一个不会对其他测试产生副作用的测试

    验证程序
    类用于同一包中的其他类。首先使用这些类的公共接口编写一个失败的测试,然后通过实现验证使其通过。不需要思考

    如果您单独测试这个类,您可能会在其他类中模拟这个类,并验证是否真正调用了
    startValidation()
    。这样做的缺点是将测试代码与实现代码耦合在一起。我会说:不要那样做


    我最近写了一篇关于这一点的文章,在底部有一个链接,链接到Ian Cooper的一篇演示文稿,深入探讨了这一点。

    不要孤立地测试这个类。单元测试,至少在Kent Beck设想的TDD精神下,不是针对单个类或方法的测试,而只是一个不会对其他测试产生副作用的测试

    验证程序
    类用于同一包中的其他类。首先使用这些类的公共接口编写一个失败的测试,然后通过实现验证使其通过。不需要思考

    如果您单独测试这个类,您可能会在其他类中模拟这个类,并验证是否真正调用了
    startValidation()
    。这样做的缺点是将测试代码与实现代码耦合在一起。我会说:不要那样做


    我最近写了一篇关于这一点的文章,在底部有一个链接,链接指向伊恩·库珀的一篇演讲,深入探讨了这一点。

    你到底想测试什么?这段代码没有做任何有用的事情:唯一可访问的方法没有返回值,也没有任何副作用。此外,方法的可访问性不是提高安全性的一种方法。它有助于设计和封装。任何方法,即使是私有的,都可以通过反射调用。@JBNizet如果用户不满足某些条件,则在
    validateUser
    中可能会抛出异常。然后