2010-05-25 56 views
0

我正在構建一個測試,在我需要發送問題,並等待答案。 消息傳遞不是問題。事實上,要弄清楚至極答案是否與這個問題相對應,我使用了一個id。我的ID是使用UUID生成的。我想檢索這個ID,這是作爲一個模擬對象的參數。 它看起來像這樣:使用jmock如何重用參數

oneOf(message).setJMSCorrelationID(with(correlationId)); 
      inSequence(sequence); 

其中的correlationID是我想繼續爲其他expecteation像這樣的字符串:

oneOf(session).createBrowser(with(inputChannel), 
      with("JMSType ='pong' AND JMSCorrelationId = '"+correlationId+"'")); 

你有答案嗎?

+0

您的測試是否生成ID?或者被測代碼是否生成它?這兩個期望是否出現在相同的測試用例中? – 2010-05-25 21:41:08

+0

下測試的代碼生成它 和 是最後用以下爲例,它採用兩個時間 ,並finnaly比較參數傳遞它的工作 – benzen 2010-05-26 18:25:10

回答

0

還有一個值得考慮的選擇,哪裏的相關ID從何而來?是否應該注入該活動,以便您可以控制它並在測試中檢查它?

+0

我工作在一箇舊的j2se程序 所以我不能使用依賴注入 我可以使用手動注入,但看起來很奇怪。 但一般來說你的身份證是好的 – benzen 2010-05-28 21:30:42

4

您必須創建自己的操作。這裏是我的:

/** 
* puts the parameter array as elements in the list 
* @param parameters A mutable list, will be cleared when the Action is invoked. 
*/ 
public static Action captureParameters(final List<Object> parameters) { 
    return new CustomAction("captures parameters") { 
     public Object invoke(Invocation invocation) throws Throwable { 
      parameters.clear(); 
      parameters.addAll(Arrays.asList(invocation.getParametersAsArray())); 
      return null; 
     } 
    }; 
} 

然後你使用這樣的(用靜態導入):

final List<Object> parameters = new ArrayList<Object>(); 
    final SomeInterface services = context.mock(SomeInterface.class); 
    context.checking(new Expectations() {{ 
     oneOf(services).createNew(with(6420), with(aNonNull(TransactionAttributes.class))); 
      will(doAll(captureParameters(parameters), returnValue(true))); 
    }}); 

做你想做什麼,你必須實現自己的匹配。這是我砍死了(一些空檢查排除在外,當然我只是使用的樣品衆所周知接口):

@RunWith(JMock.class) 
public class Scrap { 

private Mockery context = new JUnit4Mockery(); 

@Test 
public void testCaptureParameters() throws Exception { 
    final CharSequence mock = context.mock(CharSequence.class); 
    final ResultSet rs = context.mock(ResultSet.class); 
    final List<Object> parameters = new ArrayList<Object>(); 
    context.checking(new Expectations(){{ 
     oneOf(mock).charAt(10); 
      will(doAll(JMockActions.captureParameters(parameters), returnValue((char) 0))); 
     oneOf(rs).getInt(with(new ParameterMatcher<Integer>(parameters, 0))); 
    }}); 

    mock.charAt(10); 
    rs.getInt(10); 
} 

private static class ParameterMatcher<T> extends BaseMatcher<T> { 
    private List<?> parameters; 
    private int index; 

    private ParameterMatcher(List<?> parameters, int index) { 
     this.parameters = parameters; 
     this.index = index; 
    } 

    public boolean matches(Object item) { 
     return item.equals(parameters.get(index)); 
    } 

    public void describeTo(Description description) { 
     description.appendValue(parameters.get(index)); 
    } 
} 
} 
+0

用這種方法看起來像是立刻之後我不能使用的參數內容,在相同的期望定義 – benzen 2010-05-26 13:56:49

+0

@ BenZen,我從來沒有嘗試過,但我無法想象爲什麼它不會工作。我會試一試。 – Yishai 2010-05-26 14:18:23

0

我發現在這個網站 http://www.symphonious.net/2010/03/09/returning-parameters-in-jmock-2/

import org.hamcrest.*; 
import org.jmock.api.*; 

public class CapturingMatcher<T> extends BaseMatcher<T> implements Action { 
public T captured; 

public boolean matches(Object o) { 
    try { 
     captured = (T)o; 
     return true; 
    } catch (ClassCastException e) { 
     return false; 
    } 
} 

public void describeTo(Description description) { 
    description.appendText("captured value "); 
    description.appendValue(captured); 
} 

public Object invoke(Invocation invocation) throws Throwable { 
    return captured; 
} 
} 
的其他解決方案

然後它可以用於像:

context.checking(new Expectations() {{ 
CapturingMatcher<String> returnCapturedValue = new CapturingMatcher<String>(); 
allowing(mockObject).getParameter(with(equal("expectedParameterName")), with(returnCapturedValue)); will(returnCapturedValue); 
}}); 
+0

不錯,儘管作者不理解在泛型上下文中的投射(由於類型擦除除非T被聲明爲擴展某些東西,所以不能拋出ClassCastException)。這種解決方案的缺點是,如果問題很重要,您實際上不會捕獲參數供以後在測試中使用。 – Yishai 2010-05-26 14:48:05

+0

實際上這個解決方案只有在你立刻使用捕獲的值時纔有幫助 你的解決方案很好 我使用它,對不起 – benzen 2010-05-26 14:53:05

+0

如果你需要捕獲參數,最好使用Action而不是Matcher。匹配器可以被調用多次,而一個Action只會被調用一次。 – 2010-12-04 10:12:09