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

Mockito:Java-未完成的stubbing检测

康泽宇
2023-03-14
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at       com.rbc.rewards.catalogue.service.B2SServicesTest.getProductList_Success(B2SServ icesTest.java:52)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
  when(mock.isOk()).thenReturn(true);
  when(mock.isOk()).thenThrow(exception);
  doThrow(exception).when(mock).someVoidMethod();
Hints:
  1. missing thenReturn()
  2. you are trying to stub a final method, you naughty developer!
  3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

我在两篇关于堆栈溢出的文章中读到过关于这个问题的文章,但它们没有详细说明。我相信这与在嘲笑中嵌套嘲笑有关(根据我读到的)。然而,我并没有看到或完全理解人们张贴的小片段。

我的测试类如下所示(省略了不必要的代码):

// Mock:  uses Java Reflection in order to create mock objects of each class
@Mock
private Scrapes scrapeS;
@Mock
private SsoS ssoS;
@Mock
private BScrape bScrape;

//@InjectMocks annotation is used to create and inject the mock object
@Mock
private BService bService;


@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

// Testing:
@Test
public void getProductList_Success() throws Exception{

        when(BService.getProductList("cookie", "6753"))
                .thenReturn(
                scrapeS.scrapePost(new String(),
                        new String(),
                        new HashMap<>(),
                        new bService()));
}

我需要调用的方法:

public List<prodItem> getProdList(String raw_cookie, String catId) throws Exception {
    String url = ssoSetting.getUrls().BProductList();
    String post = "url" + catId +"url";
    BScrape scraper = new BScrape ();
    Map<String, String> postRequest = new HashMap();
    postRequest.put("searchRequestParams", post);
    return scrapeS.scrapePost(url, raw_cookie, postRequest, scraper);
}
@Mock
private SSetting sSetting = new SSetting ();
// Mock:  uses Java Reflection in order to create mock objects and is injected into InjectMocks
@Mock
private ProdItem productItem = new ProdItem ();
@Mock
private sService scrapeService = new sService ();
@Mock
private BScrape bScrape ;

//@InjectMocks annotation is used to create and inject the mock object
@InjectMocks
private BService bService = new BService ();

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

// Testing:
@Test
public void getProductList_Success() throws Exception{

    List<ProductItem> retList = new ArrayList<>();
    retList.add(new ProductItem());
    retList.add(new ProductItem());

    //try{
    when(b2SServices.getProductList("cookie", "6753")).thenCallRealMethod();

    //test the add functionality
    when(BService .getProdList("cookie", "6753")).thenReturn(retList);


    }catch(Exception exception){
        System.out.println(exception);
    }
}

共有1个答案

阮飞翔
2023-03-14

您处于第三种情况:

3:如果完成的话,在“然后返回”指令之前,您正在插入另一个模拟的行为

发生这种情况是因为thenReturn从另一个模拟调用方法Scrapes.ScrapePost。很难确切地说如何修复这个问题,因为我需要更多的实现细节,但是尝试在之前构建返回对象,当时,它不应该是另一个模拟的返回。这里有一个很好的解释:https://stackoverflow.com/a/26319364/1121883

@Test
public void play(){
    A a = mock(A.class);
    B b = mock(B.class);
    when(a.a("input")).thenReturn(b.b("input"));
}

@Test
public void fix(){
    A a = mock(A.class);
    B b = mock(B.class);
    String returnString = "b";
    when(a.a("input")).thenReturn(returnString);
}

static class A{
    String a(String in){
        return "a";
    }
} 

static class B{
    String b(String in){
        return "b";
    }
}
    List<prodItem> retList = new ArrayList<>();
    retList.add(new ProdItem());
    retList.add(new ProdItem());
    when(bService.getProductList("cookie", "6753")).thenReturn(retList);
 类似资料:
  • 我经历了这个问题,也经历了这个问题。但他们都没有帮助。有人能让我知道我做错了什么吗?

  • 当运行以下代码时,我将在此处得到未完成的Stubbing检测到的错误消息: 这是带有公共静态空MyMethod的MyClass。 } 当运行这个方法时,我得到的是UnfinishedStubbingException。

  • 运行以下代码时,我在此处检测到错误消息Unfinished stubing: 这是带有公共静态void myMethod的MyClass。 } 这是MyClass2和myMethod2方法。在myMethod2内部,myMethod正在调用。 } 这里是为测试myMethod2而编写的测试用例。 } 当运行这个方法时,我得到了UnfinishedStubbingException。

  • 问题内容: 运行测试时出现以下异常。我正在使用Mockito进行嘲笑。Mockito库提到的提示无济于事。 来自的测试代码。当我运行以下测试时,我看到了异常。 问题答案: 您是在嘲笑内部嵌套嘲笑。在完成对的模拟之前,您正在呼叫,它会进行一些模拟。执行此操作时,Mockito不喜欢它。 更换 与 要了解为什么这会导致问题,您需要稍微了解Mockito的工作方式,并且还需要知道Java中表达式和语句按

  • 我在运行测试时遇到了以下异常。我在用Mockito来嘲笑。Mockito库提到的提示没有帮助。 从测试代码。当我运行以下测试时,我看到异常。

  • 我正在使用kafka和elasticsearch设置flink流处理器。我想重播我的数据,但当我将并行度设置为1以上时,它不会完成程序,我认为这是因为Kafka流只看到一条消息,将其标识为流的结尾。 有没有办法告诉flink消费群中的所有线程在一个线程完成后立即结束?