junit mock私有构造函数和它的多个参数与mockk

9rbhqvlz  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(338)

我想用它的多个参数来模拟一个类的私有构造函数(使用Kotlin):

public final class Foo {

   public static class Bla {
        public final CustomType1 property1;
        public final CustomType2 property2;

        private Bla(CustomType1 param1, CustomType2 param2) {
            this.property1 = (CustomType1)Objects.requireNonNull(param1);
            this.property2 = (CustomType2)Objects.requireNonNull(param2);
        }
    }
}

通过它,我试图模拟属性(property1, property2),否则几乎不可能模拟。

gzszwxb4

gzszwxb41#

也许一个私有构造函数不是你要找的。使用私有构造函数,可以将对象创建限制在类Bla内。看看here
如果出于某种原因,你需要将构造函数设置为私有,那么你可以尝试使用this issue中提到的反射,但请记住,它实际上会在运行时将private修饰符设置为public

cbwuti44

cbwuti442#

我认为只有两种方法。第一个已经提到了@micartey,第二个是使用PowerMockito。它是一个强大的工具,允许您模拟静态和私有方法。如果我们谈论代码。所以它看起来应该是这样:

@RunWith(PowerMockRunner::class)
class FooTest {

    @Test
    fun testBlaConstructor() {

        val customType1Mock = mock(CustomType1::class.java)
        val customType2Mock = mock(CustomType2::class.java)

        val blaMock = mock(Bla::class.java)
        whenNew(Bla::class.java)
            .withArguments(customType1Mock, customType2Mock)
            .thenReturn(blaMock)

        val blaInstance = Bla(customType1Mock, customType2Mock)
        verify(blaMock).property1 = customType1Mock
        verify(blaMock).property2 = customType2Mock
    }

不要忘记为PowerMockito准备依赖项

**注意:Power Mock应用于无法更改已提供代码的遗留应用程序。通常,这样的代码没有单元/集成测试,即使是很小的更改也可能导致应用程序中的错误。

相关问题