JUnit 4.xx (Java) 尝试获取行覆盖率时 Mockito 出现问题

JUnit 4.xx (Java) Trouble with Mockito when Trying to Get Line Coverage

以下是我的主要代码

public class KafkaConsumerForTests {

private ConsumerRecords<String, String> records;
private GenericKafkaConsumer<String, String> consumer;

    @Override
    public void run() {

        try {

            while (true) {

               LOGGER.logp(Level.INFO, CLASS_NAME, "run()", "Attempting to Poll");
               records = consumer.poll(10000);
               int numOfRecords = records.count();

               **if (numOfRecords == 0) {** // I want to get line coverage for this branch

                LOGGER.logp(Level.INFO, CLASS_NAME, "run()", "No Response. Invalid Topic");
                break;
            }

            **else if(numOfRecords > 0) {** // I want to get line coverage for this branch.

                LOGGER.logp(Level.INFO, CLASS_NAME, "run()", "Response Received");
            }
        }

    } catch (WakeupException e) {
        consumer.close();
    }

  }

}

如您所见,我想获取以下分支的行覆盖率以测试它是否正确记录。我尝试模拟 records.count(); 的实例你可以在下面看到我的测试用例代码。

@Test
public void testRunWithZeroRecords() throws IOException {

    KafkaConsumerForTests consumerThread3 = spy(new KafkaConsumerForTests("topic_pleasestuff", "lmao"));

    ConsumerRecords<String, String> mock2 = mock(ConsumerRecords.class);

    consumerThread3.records = mock2;

    when(mock2.count()).thenReturn(9);

    consumerThread3.run();

    //verify(mock2, times(1)).count();
}

无论我做什么,我都不会打:

else if(numOfRecords > 0)

我返回一个大于 0 的数字。就好像 records.count(); 甚至都不是在模拟中执行。对于任何约定或 Whosebug 问题语法错误,我深表歉意。我是 Java 社区的新手。

您的 mock2.count() 没有发生,因为在您正在测试的方法中调用 count() 之前,您将 records 重新分配给 [=14= 的结果].

您需要创建模拟,比如 mockRecordsmockConsumer;然后用您创建的模拟注入 consumer 。然后包括像

这样的存根行
doReturn(mockRecords).when(mockConsumer).poll(10000);

在您致电 run 之前。