Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试一个fire-and-forget方法_Java_Android_Junit_Mockito - Fatal编程技术网

Java 单元测试一个fire-and-forget方法

Java 单元测试一个fire-and-forget方法,java,android,junit,mockito,Java,Android,Junit,Mockito,我在Android上开发,但我对单元测试是新手(JUnit和mockito) 我写了一个方法,你可以调用它并忘记它(fire&forget)。这对你来说(一点也不)对不对 该方法只需调用Google Analytics发送一些分析信息,因此它在应用程序中并不重要 我调用我的代码来myGoogleAnalyticSingleton.googleAnalytics\u sendViewProduct(myProduct) 我忘了这件事了 “googleAnalytics_sendViewProduc

我在Android上开发,但我对单元测试是新手(JUnit和mockito)

我写了一个方法,你可以调用它并忘记它(fire&forget)。这对你来说(一点也不)对不对

该方法只需调用Google Analytics发送一些分析信息,因此它在应用程序中并不重要

我调用我的代码来
myGoogleAnalyticSingleton.googleAnalytics\u sendViewProduct(myProduct)
我忘了这件事了

“googleAnalytics_sendViewProduct(MyProduct MyProduct)”方法类似于:

    public void googleAnalytics_sendViewProduct(MyProduct myProduct) {
    final GA_Product gaProduct = new GA_Product(myProduct.getId(),
                                                myProduct.getName(),
                                                myProduct.(so on));

trackerAnalytics.send(gaProduct);
    }
因此,问题是: 如何测试每个方法(查看产品、将产品添加到购物车、从购物车中删除产品等)是否发送度量和正确的参数

public void test_gaViewProduct() {
   assertEquals(gaProduct.getId, myTestIdonMyProductModel);
   assertEquals(gaProduct.getName, myTestNameOnMyProductModel);
   assertEquals .....
  assertTrue(sendWasCalled());
}
我是测试新手,所以我不确定我的想法是否有问题


谢谢。

模拟跟踪器并将其注入测试代码:

Tracker mockTracker = mock(Tracker.class);
product.setTracker(mockTracker);
调用测试代码(查看产品、添加到购物车等)

然后只需验证是否调用了所需的方法,例如:

verify(mockTracker).setScreenName("myscreenname");
verify(mockTracker).send(new HitBuilders.AppViewBuilder()
        .setCategory("category", TRACKING_ID)
        .build());
进入

将分析调用隐藏在接口后面。创建一个在实际生产代码中使用的实现,以及一个仅在测试中使用的实现。 测试类可能会计算它收到的调用的数量,等等。然后,您可以通过调用以下命令从测试中验证它

assertTrue(analyticsConnector.connectionsMade() == n);
在测试代码中


我推荐这段视频,其中有一些亮点。

模拟
trackerAnalytics
对象;验证是否在mock上调用了
send
方法,传入
ArgumentCaptor
实例以捕获调用该方法的参数;assert捕获的参数的属性。请注意,
assert
是一个关键字,我想您的意思可能是
assertEquals
;JUnit中
assertEquals
参数的顺序是预期的、实际的;您的参数设置错误。这仍然会检查它们是否不相等,只是失败消息会让人困惑。啊哈,可以工作了,你能给ArgumentCaptor添加一些代码吗?我现在正在阅读有关它的信息,但任何信息都将不胜感激;)。如果你想要一个被接受的答案,你不需要评论,但需要一个答案呵呵呵呵是的,这只是伪代码,谷歌分析代码也不正确。这个问题的答案解释了如何使用
ArgumentCaptor
:谢谢你,我知道如何进行“发送”的验证,真正的问题是如何测试发送的产品是正确的,因为它是内部实例,不可在外部测试。您应该让跟踪程序从外部访问(用于测试目的)。私人包裹可以。如果不能,可以使用Mockitos
Whitebox.setInternalState()
方法注入私有字段。如果您想知道是否发送了正确的数据,可以将所需的方法添加到
verify()
方法中。或者我没有正确理解你的问题。那是错误的,因为它是私人的,有一个原因,测试不能改变这种行为。我来看看你说的白色盒子可能有用。谢谢,错了!复制代码,一个测试是不这样做的。。。这是为了避免this@Sulfkain我看不出这是怎么回事,请开导我好吗?它可能需要一些额外的代码,但您得到的是可测试性。使用mock,您可以模拟您的类,而不必编写类,但老实说,它实际上应该是一个接口。如果您想在不同的位置或多个位置记录不同的产品,该怎么办?@Sulfkain测试不用于查找重复代码(尽管如果您这样做,最好删除)。它们是为了确保代码的正确性。它们还带来了强制您编写可扩展代码的好处。在编写小程序时(不是查找,而是避免)。我同意第二部分,我不能实现两种方法,一种用于生产,一种用于测试。我必须测试生产方法
assertTrue(analyticsConnector.connectionsMade() == n);