小编wen*_*nic的帖子

hamcrest hasItem和hasProperty,断言是否存在具有属性值的对象

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页面,它应该是有效的,但我得到上述错误.

java unit-testing hamcrest

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

单元测试数据访问层的方法

我一直试图寻找一种有效的方法来在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)

c# testing persistence unit-testing data-access-layer

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

在spring-data-rest中使用验证器返回http 500而不是400

我正试图在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)

spring spring-mvc spring-data-rest

11
推荐指数
1
解决办法
3984
查看次数

spring-data-rest,你能提供实体的全部细节而不是(或)链接

有没有办法返回已加入实体的完整详细信息而不是链接?在下面的示例中,我还要返回产品的详细信息,如果我有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)

java spring spring-data-jpa spring-data-rest

8
推荐指数
1
解决办法
4774
查看次数

模拟列表或模拟对象列表

我有一个使用对象列表的类。你会如何嘲笑这份名单,为什么?您是否模拟列表,以便在调用列表方法时返回模拟对象。或者您是否使用模拟对象创建列表的实例?

下面是一个粗略的代码示例。因此,如果我模拟列表,我需要知道如何使用列表并在列表的方法上设置正确的返回/期望。或者使用模拟对象列表,我只需要使用模拟对象设置列表并断言每个模拟订阅者都已“使用”。

我测试了每个订阅者都被调用,在我看来后一种方法是正确的,你的看法是什么?

public class Publisher {

    private List<Subscriber> subscribers;

    public void publish() {
        // loop through subscribers
    }

}
Run Code Online (Sandbox Code Playgroud)

c# java unit-testing list mocking

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