我目前正在寻找为基于Web服务的JAX-RS(基于REST的Web服务的Java API)创建自动化测试的方法.
我基本上需要一种方法来发送它某些输入并验证我得到了预期的响应.我宁愿通过JUnit这样做,但我不确定如何实现.
您使用什么方法来测试您的Web服务?
更新:正如entzik指出的那样,将Web服务与业务逻辑分离后,我可以对业务逻辑进行单元测试.但是,我还想测试正确的HTTP状态代码等.
我有两个相关的分支JPA注释.报警和状态.一个警报可以有一个状态.
我需要的是能够删除一个状态并将空值"传播"到该状态中已删除的警报.
也就是说,我需要将外键定义为" on delete set null ".
@Entity
public class Alarm {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
@SequenceGenerator(name="sequence", sequenceName="alarm_pk_seq")
private Integer id;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="idStatus")
private Status status;
// get/set
}
@Entity
public class Status {
@Id
@Column(name="idStatus")
private Integer id;
private String description;
// get/set
}
Run Code Online (Sandbox Code Playgroud)
例:
之前:
STATUS
id description
1 new
2 assigned
3 closed
ALARMS
id status
1 1
2 2
3 2
Run Code Online (Sandbox Code Playgroud)
之后(删除id = 2的状态)
STATUS
id description
1 new
3 closed
ALARMS
id status
1 1 …
Run Code Online (Sandbox Code Playgroud) 我需要创建一个类似于下面的XML模式:
<xs:element name="wrapperElement">
<xs:complexType>
<xs:sequence>
<xs:element type="el1">
<xs:element type="el2">
</xs:sequence>
<xs:WhatGoesHere?>
<xs:element type="el3">
<xs:element type="el4">
<xs:element type="el5">
</xs:WhatGoesHere?>
<xs:sequence>
<xs:element type="el6">
<xs:element type="el7">
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
我需要的是替换"WhatGoesHere",这样任何数量的el3,el4和el5都可以按任何顺序出现.例如,它可以包含{el3,el3,el5,el3}
关于如何解决这个问题的任何想法?
我有类似下面定义的过滤器.它们在不同的地方运行相同的代码块,所以为了保持DRY,我将该代码重构为一个名为doResponse()的方法.
class MyFilters {
def filters = {
web(uri: '/web/**') {
before = {
// Do Stuff
if (condition) {
doResponse(request, response, params)
}
return true
}
after = {
if (condition) {
doResponse(request, response, params)
}
else {
// Do Stuff
doResponse(request, response, params)
}
}
afterView = {
}
}
}
boolean doResponse(request, response, params) {
// Do Stuff
render(status: statusCode, contentType: "text/xml", encoding: "ISO-8859-1", text: text)
// Do post-render stuff
return false
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这有一个令人讨厌的副作用.似乎render()方法只能从过滤器闭包中获得.我是否有任何(简洁的)方式从doResponse()调用render()?
编辑:我得到的错误是:
groovy.lang.MissingMethodException:没有方法签名:MyFilters.render()适用于参数类型:(java.util.LinkedHashMap)值:[[status:500,contentType:text/xml,encoding:ISO-8859-1 …
我有一个用于Web服务的maven POM文件.对于其中一个依赖项,我必须为已经保存在Web应用程序服务器中更高级别的jar文件指定几个排除项(所有Web应用程序都可以访问,而不仅仅是这个特定的应用程序).这种排除的一个例子是包含我的JDBC驱动程序的JAR.
示例(带有虚构的细节):
<dependency>
<groupId>mygroup</groupId>
<artifactId>myartifact</artifactId>
<version>1.0.0</version>
<exclusions>
<!--The jdbc driver causes hot-deployment issues-->
<exclusion>
<groupId>db.drivers</groupId>
<artifactId>jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我的测试需要JDBC驱动程序.我的测试目前失败,因为他们无法加载JDBC驱动程序.
如何配置POM以便我的测试可以访问排除的部分,但是不能包含在我的WAR文件中?
更新:我无法更改mygroup.myartifact的POM,因为它依赖于许多其他项目,并且此排除要求对于我的项目是唯一的.
更新2:似乎我在描述这个问题方面表现不佳.下面的Lars解决方案非常适合一个排除(如示例所示),但在我的实际场景中,我有多个排除项,并且为每个排除项添加额外的依赖项似乎很臭.这似乎工作的解决方案是设置所示依赖性的范围,以编译,然后创建一个第二依赖同一工件(mygroup.myartifact),没有排除和设置为范围测试.由于拉尔斯都正确地回答了我的措辞问题,并且引导我朝着实际解决的方向发展,我将把他的回答标记为答案.
java ×3
deployment ×1
dry ×1
filter ×1
foreign-keys ×1
grails ×1
groovy ×1
hibernate ×1
jax-rs ×1
jpa ×1
junit ×1
maven-2 ×1
orm ×1
schema ×1
unit-testing ×1
web-services ×1
xml ×1
xsd ×1