import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.equalTo;
assertThat(actual, hasItem(hasProperty("id", equalTo(1L))));
Run Code Online (Sandbox Code Playgroud)
其中,实际是一个ID为Long的POJO.
我明白了
assertThat(T, Matcher<? super T>)
类型中的方法MatcherAssert
不适用于参数(List<Pojo>, Matcher<Iterable<? super Object>>)
从各种文档和其他stackoverflow页面,它应该是有效的,但我得到上述错误.
我一直试图寻找一种有效的方法来在C#中对我的数据访问层进行单元测试.我是主要的Java开发人员,并且只使用了C#大约6个月,过去我使用了一个名为DBUnit的库来测试已知的状态数据库.我一直无法找到一个可以使用的类似活动库,最近似乎是nDBUnit,但它现在已经有一段时间没有活动了.
关于C#中的方式和原因似乎存在很多相互矛盾的方法.理想情况下,我想使用模拟测试数据访问层,而无需连接到数据库,然后在一组单独的测试中对存储过程进行单元测试.
在我正在研究的系统中,数据访问层是使用ADO.net(不使用实体框架)来调用SQL Server上的存储过程.
下面是我必须使用的示例代码; 沿着模拟路径走下去,我必须能够模拟SqlCommand(使用IDbCommand)和/或模拟SqlConnection.
所以我的问题是什么似乎是最好的方式(如果有这样的事情)这样做?到目前为止,唯一的方法是使代理对象传递给构造函数,以便它可以返回模拟的Sql*对象进行测试.
我还没有机会查看所有可用的C#模拟库.
public class CustomerRepository : ICustomerRepository
{
private string connectionString;
public CustomerRepository (string connectionString)
{
this.connectionString = connectionString;
}
public int Create(Customer customer)
{
SqlParameter paramOutId = new SqlParameter("@out_id", SqlDbType.Int);
paramOutId.Direction = ParameterDirection.Output;
List<SqlParameter> sqlParams = new List<SqlParameter>()
{
paramOutId,
new SqlParameter("@name", customer.Name)
}
SqlConnection connection = GetConnection();
try
{
SqlCommand command = new SqlCommand("store_proc_name", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddRange(sqlParams.ToArray());
int results = command.ExecuteNonQuery();
return (int) paramOutId.Value;
}
finally
{
CloseConnection(connection);
}
} …
Run Code Online (Sandbox Code Playgroud) 我正试图在spring-data-rest中进行验证.从文档中你只需要提供一个验证器,我就可以使用它,但是当成功捕获/处理验证约束时,我会得到一个带有堆栈跟踪的500错误页面.
在config类中,RepositoryRestMvcConfiguration它有一个validationExceptionHandler,它看起来应该得到这样的验证错误,返回400而不是500.它也是一个延迟加载的bean.
我的设置不正确吗?还是有另一种方法让spring-data-rest返回400而不是500?
我正在使用spring-data-rest版本2.0.0版本
tomcat返回堆栈跟踪:
HTTP Status 500 - Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [test.domain.Account] during persist time for groups [javax.validation.groups.Default, ]
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [test.domain.Account] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='size must be between 0 and 10', propertyPath=login, rootBeanClass=class test.domain.Account, messageTemplate='{javax.validation.constraints.Size.message}'}
]
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Run Code Online (Sandbox Code Playgroud)
账户实体:
@Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) …
Run Code Online (Sandbox Code Playgroud) 有没有办法返回已加入实体的完整详细信息而不是链接?在下面的示例中,我还要返回产品的详细信息,如果我有100个购买列表,则可以避免拨打100个电话来获取产品详细信息.
Product,User和Purchase实体的存储库都是使用spring-data-jpa创建的
{
"_embedded" : {
"purchase" : [ {
"_links" : {
"product" : {
"href" : "http://localhost:8080/webapp/purchase/1/product"
},
"user" : {
"href" : "http://localhost:8080/webapp/purchase/1/user"
}
},
"purchasedOn" : "2014-02-23",
"amount" : 1
} ]
}
}
Run Code Online (Sandbox Code Playgroud)
实体和存储库;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = Purchase.class, orphanRemoval = true)
@JoinColumn(name = "user_id", updatable = false)
private List<Purchase> purchases = new ArrayList<>();
}
@Entity
public class Product …
Run Code Online (Sandbox Code Playgroud) 我有一个使用对象列表的类。你会如何嘲笑这份名单,为什么?您是否模拟列表,以便在调用列表方法时返回模拟对象。或者您是否使用模拟对象创建列表的实例?
下面是一个粗略的代码示例。因此,如果我模拟列表,我需要知道如何使用列表并在列表的方法上设置正确的返回/期望。或者使用模拟对象列表,我只需要使用模拟对象设置列表并断言每个模拟订阅者都已“使用”。
我测试了每个订阅者都被调用,在我看来后一种方法是正确的,你的看法是什么?
public class Publisher {
private List<Subscriber> subscribers;
public void publish() {
// loop through subscribers
}
}
Run Code Online (Sandbox Code Playgroud) java ×3
unit-testing ×3
c# ×2
spring ×2
hamcrest ×1
list ×1
mocking ×1
persistence ×1
spring-mvc ×1
testing ×1