小编Lui*_*uel的帖子

模拟我正在测试的同一个类中的方法调用,它真的是代码味道吗?

我正在尝试测试一个服务类(负责调用存储库层并在需要时执行一些操作),基本上,这是我正在尝试测试的类

class CarServiceImpl{
  public Car findById(String id){
      //call repository layer to find a car
  }

  public void deleteById(String id){
      Car car = this.findById(id);
      if(car != null){ 
          //Call repository layer to update the car
      }else{
          Throw NotFOundException();
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我在deleteById方法上调用了findById方法,所以我的问题是.

  1. 在同一个类上调用方法真的是代码味道吗?我不认为我应该创建一个单独的类来通过id找到一辆汽车.

  2. 如何在"deleteById"方法上模拟对"findById"的调用,如果我使用Mockito.when(carServiceImpl.findById("car1")).thenReturn(carModel); 它仍然调用方法,所以我需要模拟对存储库的调用以便通过id查找,即使我已经测试了方法findById .

java junit mockito

7
推荐指数
1
解决办法
2544
查看次数

以不同的方法将操作附加到Stream是不好的做法?

假设我的应用程序中有多个类使用的方法.此方法将a Stream作为参数并应用终端操作forEach以将数据写入文件,如下所示:

public File writeStreamToTempFile(Stream stream) {
    stream.forEach(item -> {
        //some code to write item to a file
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法有多个调用者,在某些方法中我需要转换数据,比方说使用map函数,如下所示:

public void exportAnimalsData() {
    Stream<Animal> animalStream = //fetch data from a DB
    animals.filter(a -> a.type.equals("dog"))
           .map(a -> //Do something useful to transform the Dogs);

    writeStreamToTempFile(animalStream);
}
Run Code Online (Sandbox Code Playgroud)

并非该writeStreamToTempFile方法的所有调用者都需要对流执行其他操作.

所以我的问题是:

将操作应用于不同方法的流是不好的做法?

我在某地读过Stream永远不应该是方法的返回类型(调用者不知道该方法是否已经消耗了流),它是否也适用于方法的参数?

我应该只应用相同方法中所需的所有操作,还是可以在不同的方法中将中间操作附加到同一个流中?

java java-8 java-stream

3
推荐指数
1
解决办法
102
查看次数

Docker绑定8080端口时无法访问Host中的应用程序

我有一个带有 Java spring boot 应用程序的 docker 映像,该应用程序在端口 8080 的 docker 容器中启动和运行没有问题,正如您在部分日志中看到的那样:

\n\n
   2020-02-24 02:09:07.906  INFO : Tomcat started on port(s): 8080 (http) with context path \'/web-app\'\n   2020-02-24 02:09:07.909  INFO : Started web-app in 7.034 seconds (JVM running for 7.601)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我在容器内运行curl命令(使用终端),我会得到正确的响应,表明服务器正在运行并且正在运行。

\n\n
/# curl http://localhost:8080/web-app/cars/1\n{"id":"1"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,当我尝试访问主机上的应用程序时,问题就来了,我正在使用 Windows 10 顺便说一句(在网络浏览器中http://localhost:8080/web-app/cars/1),这里是如何我运行泊坞窗图像。

\n\n
docker run web-app -p 8080:8080\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,我不认为这是 Windows 问题,因为我可以运行一个简单的 nginx 服务器,并且可以毫无问题地在主机上访问它。

\n\n
docker run -d -p 80:80 nginx\n
Run Code Online (Sandbox Code Playgroud)\n\n

我注意到的一件事是当看到正在运行的容器时,端口列

\n\n
C:\\Users\\luis>docker ps\nCONTAINER ID        IMAGE               COMMAND                  CREATED …
Run Code Online (Sandbox Code Playgroud)

docker docker-for-windows docker-network

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

云形成 Nested Stacks 使用 TemplateURL 版本控制模板的最佳方式

我们正在创建一个要部署在多个环境(dev、qa、stg、prd)中的微服务项目,我们计划利用云形成模板,使用嵌套堆栈来实现多个服务之间的共享资源。问题是,当使用嵌套堆栈时,您需要指定嵌套资源的 TemplateURL,这是一个指向 S3 存储桶的静态 URL,每次更新模板时该 URL 都会发生变化(上传包含一些更改的新模板)。

所以问题是,使用 GIT 等版本控制工具来跟踪嵌套模板中所做的更改(一旦上传到 S3 就会给您一个新的 URL)的最佳方法是什么?

version-control aws-cloudformation

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