小编Ben*_*Ben的帖子

如何对调用Jersey Client API的代码进行单元测试?

我编写了调用Jersey客户端API的代码,后者又调用了一个不受我控制的Web服务.我不希望我的单元测试调用实际的Web服务.

为调用Jersey客户端API的代码编写单元测试的最佳方法是什么?我应该使用Jersey服务器API编写JAX-RS Web服务,然后使用Jersey Test Framework进行单元测试吗?或者我应该模拟泽西岛网络服务电话?我可以访问JMock.或者我应该尝试另一种方法?

在我的研究中,我发现这个讨论描述了各种选项,但我找到了一个完整的解决方案.是否有可用的代码示例显示建议的JUnit方法?我在泽西文档中找不到任何内容.

这是相关的源代码:

public String getResult(URI uri) throws Exception {
  // error handling code removed for clarity
  ClientConfig clientConfig = new DefaultClientConfig();
  Client client = Client.create(clientConfig);
  WebResource service = client.resource(uri);
  String result = service.accept(accept).get(String.class);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

以下是我想传递的测试代码示例.我想测试(1)传入有效的URI并获取有效的字符串,以及(2)传递无效(无论出于何种原因 - 无法访问或未授权)URI并获得异常.

@Test
public void testGetResult_ValidUri() throws Exception {
  String xml = retriever.getResult(VALID_URI);
  Assert.assertFalse(StringUtils.isBlank(xml));
}

@Test(expected = IllegalArgumentException.class)
public void testGetResult_InvalidUri() throws Exception {
  retriever.getResult(INVALID_URI);
}
Run Code Online (Sandbox Code Playgroud)

以上所有内容都是我的代码所做的简单描述.实际上,在它上面有一个接受两个URI的层,首先尝试调用第一个URI,如果该URI失败,那么它会尝试调用第二个URI.我希望单元测试包括(1)第一个URI成功,(2)第一个URI失败,第二个URI成功,(3)两个URI都失败.这段代码非常复杂,我想使用JUnit测试这些不同的场景,但要做到这一点,我需要运行实际的替代Web服务或模拟Jersey客户端API调用.

java junit unit-testing jax-rs jersey

26
推荐指数
2
解决办法
2万
查看次数

Artifactory中的工件的最新快照是否有URL?

我想永久链接Artifactory中工件的最新快照版本.如果我们使用1.0-SNAPSHOT,我想要一个下载最新1.0-SNAPSHOT JAR的URL.我可以通过在我们的服务器上找到工件找到最新的工件http://hostname/artifactory/libs-snapshot/groupId/artifactId/1.0-SNAPSHOT/.除了检查时间戳之外,我可以通过打开maven-metadata.xml并在同一目录中打开带有JAR的元数据/版本控制/快照时间戳和buildNumber来确定哪一个是最新的.这可以编写脚本,但理想情况下Artifactory已经有办法以这种方式构造永久链接.Artifactory是否提供这样的URL?

artifactory

15
推荐指数
1
解决办法
2万
查看次数

如何在Java 7中编译包含(List <Matcher> itemMatchers)?

我正在学习Hamcrest 1.3,我想在Matchers中为每个Hamcrest静态方法提供一个例子.Javadoc已经有了一些方法的例子.我测试了以下包含 Java 8的代码片段,它通过了:

assertThat(Arrays.asList("foo", "bar"), 
           contains(Arrays.asList(equalTo("foo"), equalTo("bar"))));
Run Code Online (Sandbox Code Playgroud)

但是,我的团队目前正在使用Java 7,所以我想确保所有示例都适用于该版本.上面的代码片段在Java 7中产生以下错误:

没有为assertThat找到合适的方法(java.util.List,org.hamcrest.Matcher >>>)方法org.junit.Assert.assertThat(T,org.hamcrest.Matcher)不适用(实际参数org.hamcrest.Matcher >>>无法转换为org.hamcrest.Matcher>通过方法调用转换)方法org.junit.Assert.assertThat(java.lang.String,T,org.hamcrest.Matcher)不适用(无法从参数实例化,因为实际和正式的参数列表长度不同)

我知道Java 8为静态方法添加了新的隐式类型功能,我认为这可能是相关的.我试图重构参数并将它们转换为预期的参数,但这会导致相同的错误:

List<String> actual = Arrays.asList("foo", "bar");
List<Matcher<String>> expected = Arrays.asList(equalTo("foo"), 
                                               equalTo("bar"));
assertThat(actual, contains(expected));
Run Code Online (Sandbox Code Playgroud)

static <E> Matcher<java.lang.Iterable<? extends E>> contains(java.util.List<Matcher<? super E>> itemMatchers)在Java 7中调用的正确方法是什么?

java hamcrest

6
推荐指数
1
解决办法
3586
查看次数

我可以配置MockMvcBuilders.standaloneSetup()以使用我的消息转换器XML配置吗?

我正在开发一个Spring MVC 3.2 Web应用程序,我正在尝试在我的单元测试中使用新的MockMvc测试实用程序.我想测试各个控制器以及整个Web应用程序加载我的Spring配置XML文件.从Javadoc看,我想对前者使用standaloneSetup,对后者使用webAppContextSetup.

但是,当我的控制器寻找消息转换器来转换输出时,我遇到了问题.我对standaloneSetup方法的Javadoc的解释似乎不正确.这是这个方法的Javadoc:

通过注册一个或多个@Controller的实例并以编程方式配置Spring MVC基础结构来构建MockMvc.这允许完全控制控制器的实例化和初始化及其依赖性,类似于普通单元测试,同时还可以一次测试一个控制器.

使用此选项时,将自动创建DispatcherServlet为带有带注释的控制器的请求提供服务所需的最小基础结构,并且可以对其进行自定义,从而导致配置与MVC Java配置提供的配置相同,但使用构建器样式方法除外.

如果应用程序的Spring MVC配置相对简单,例如在使用MVC命名空间或MVC Java配置时,那么使用此构建器可能是测试大多数控制器的好选择.可以使用少得多的测试来专注于测试和验证实际的Spring MVC配置.

我已经解释了"最小基础设施"和"及其依赖关系",意味着我指定的控制器除了所有依赖项外都会加载,我将其包含在消息转换器中.但是,情况似乎并非如此.我需要一个针对2个要求的自定义配置:

  1. 消耗"application/json"的PUT操作,该操作被转换为带有Joda DateTime字段的POJO.因此,我在Spring配置中包含以下内容:

    <mvc:annotation-driven>
      <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper" ref="myObjectMapper" />
        </bean>
      </mvc:message-converters>
    </mvc:annotation-driven>
    
    Run Code Online (Sandbox Code Playgroud)

    这适用于webAppContextSetup但是如果我想使用standaloneSetup,我看起来需要手动创建和配置使用我自定义的ObjectMapper配置的MappingJackson2HttpMessageConverter,它注册了JodaModule.

    standaloneSetup(myController).setMessageConverters(myJsonConverter).build();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 生成"application/custom + xml"的GET操作.当我加载webAppContextSetup时,无需额外配置即可运行.但是,当我加载standaloneSetup时,之前发生的任何Spring配置都没有发生,我看到以下错误消息:

    org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    
    Run Code Online (Sandbox Code Playgroud)

    有人可以描述这里发生了什么吗?我调用webAppContextSetup时是否包含一些隐藏或默认的消息转换器但是当我调用上面的代码时,我会以某种方式覆盖这些转换器?我怎么能包括它们?

MockMvc是否有更简单的方法来设置单个控制器以及mvc:annotation-driven中的所有配置?我可以配置MockMvcBuilders.standaloneSetup()以使用我的消息转换器XML配置而不是手动配置每个配置吗?

java spring spring-mvc spring-test spring-test-mvc

5
推荐指数
1
解决办法
3535
查看次数

实用工具类静态方法和继承

我的应用程序有一个带有静态方法的实用程序类,它负责显示通知,并可选择在发生错误时发送电子邮件:

public static void sendEvent(final String description, final String name) {
    ....
    SmtpParms smtpParams = readSmtpParms();
    ....
}

private static SmtpParms readSmtpParms() {
    // read from properties file
    ....
}
Run Code Online (Sandbox Code Playgroud)

我们的代码库在两个应用程序之间共享.应用程序A从属性文件中读取SMTP参数.我主要在应用程序B上工作.应用程序B没有使用此电子邮件功能,但仍在调用我们的GUI上显示事件通知.现在,应用程序B需要从数据库中读取SMTP参数.

我想重用现有代码,但由于这些方法是静态的,我不能只是将这个实用程序类子类化,并将所有Application B代码指向子类.这个实用程序在多个JAR中引用,我更喜欢一个尽可能少地改变代码的解决方案.

我想如果我可以readSmtpParms分成一个单独的课程,那可能会有所帮助.但我想不出一种方法将源(属性文件与数据库)传递给实用程序类实例而不更改方法签名sendEvent.我想另一种方法是创建另一种方法,sendEventUsingDatabase但我仍然需要更新sendEvent应用程序B代码中的所有引用.

有没有一个解决方案不会改变原始代码,但也不会重复代码?此代码是否与设计模式或反模式匹配?谢谢.

java design-patterns

2
推荐指数
2
解决办法
1399
查看次数

如何使用Lucene搜索不包含术语的文档?

我知道Lucene的文档

注意:NOT运算符不能仅与一个术语一起使用.例如,以下搜索将不返回任何结果:

不是"jakarta apache"

但是,我希望能够形成一个返回所有不包含术语的文档的查询.我已经研究过将MatchAllDocsQueryTermQuery串联到一个BooleanQuery中,但我似乎找不到合适的组合.

如果我索引以下两个文件

Doc0: content:The quick brown fox jumps over the lazy dog.
Doc1: (empty string)
Run Code Online (Sandbox Code Playgroud)

*:* -content:fox当我只想要一个文档时,查询返回两个文档.

这个StackOverflow答案content:^((?!fox).)*$建议的RegexQuery 返回一个文档,但它似乎没有正常工作,因为当我希望它返回两个文档时也返回一个文档.content:^((?!foo).)*$

我知道我想要做的性能影响.查询只会在几个文档上运行,所以我不太担心性能.

有没有办法写一个Lucene查询来获得我想要的东西?

java lucene

2
推荐指数
1
解决办法
3240
查看次数