小编lea*_*hru的帖子

Mockito NotaMockException

我正面临着Mockito junit测试的问题.我是新手,我对我面临的问题感到困惑.任何有关这方面的帮助将不胜感激.

class Activity{

    public void firstMethod(){

      String str = secondMethod();
   }

    public String secondMethod(){
      String str = null;

      /*  some Code */

      return str;
   }
}
Run Code Online (Sandbox Code Playgroud)

获得例外:

*org.mockito.exceptions.misusing.NotAMockException: 
 Argument passed to when() is not a mock!*
Run Code Online (Sandbox Code Playgroud)

在下面的代码中

class ActivityTest(){

  Activity act;

  @Before
  public void setup(){
     act = new Activity();
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn(Mockito.anyString()).when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 
Run Code Online (Sandbox Code Playgroud)

我知道活动不是模拟,但我不确定如何解决这个问题,因为secondMethod()同一个类中的方法.我需要编写规则,secondMethod()因为我已经完成了单元测试.组合的定义secondMethod()具有外部依赖性.我应该嘲笑存在的外部依赖关系secondMethod()并为它们编写规则而不是规则secondMethod()吗?

我发现这篇文章: Mockito Spy'ing对被单元测试的对象 然而将secondMethod()分成另一个类是没有意义的.我的方法与这个类有关.创建一个不同的测试类对我来说似乎不对.即使使用spy()模拟实际类也不是最正确的方法,正如帖子中已经解释过的那样.

我不认为我应该创建一个Activity类的模拟,因为那是我正在测试的类.我非常感谢对此的帮助和见解.

java junit unit-testing mockito

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

同一类中的模拟方法

我正在使用Mockito来模拟我正在编写测试的同一个类中的方法.我已经在SO上看到了其他答案(同一类中的模拟方法),但可能是我误解了它们,因为我遇到了问题.

 class Temp() {

    public boolean methodA(String param) {

         try {

             if(methodB(param))
                   return true;

             return false;
         } catch (Exception e) {
               e.printStackTrace();
         }
    }
 }
Run Code Online (Sandbox Code Playgroud)

我的测试方法:

 @Test
 public void testMethodA() {

    Temp temp = new Temp();
    Temp spyTemp = Mockito.spy(temp);

    Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
    boolean status = temp.methodA("XYZ");

    Assert.assertEquals(true, status);
 }
Run Code Online (Sandbox Code Playgroud)

然而,由于方法B的定义被执行,我打印出了预期.我的理解是使用spyTemp来模拟methodB的定义.然而,情况似乎并非如此.

有人可以解释我哪里出错吗?

java unit-testing mocking mockito

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

Java Parallel Streams关闭线程

我编写了一个使用Java流的方法,它简单地遍历对象列表并返回true/false,满足某些条件

Java方法:

 boolean method(SampleObj sampleObj) {

   List testList = invokeSomeMethod();
   int result = testList
            .parallelStream()
            .filter(listObj -> (listObj.getAttr() = 1))
            .count(listObj -> listObj.isAttr4());

   return (result > 10);

 }
Run Code Online (Sandbox Code Playgroud)

我也写了一个模拟测试用例.当我执行测试用例时,测试成功,但是我得到项目自定义错误,指出所有创建的线程都没有关闭.

我甚至尝试使用带有try-with-resources的流,而noo没有帮助.

模拟测试:

@Test
public void testSomeMethod() {
    SampleObj sampleObj1 = new SampleObj(10, 20, 30, true);
    SampleObj sampleObj2 = new SampleObj(10, 20, 30, true);
    SampleObj sampleObj3 = new SampleObj(10, 20, 30, false);
    SampleObj sampleObjTest = new SampleObj(10, 20, 30, true);

    List<SampleObj> testList = new ArrayList<SampleObj>();
    testList.add(sampleObj1);
    testList.add(sampleObj2);
    testList.add(sampleObj3);

    when(mockedAttribute.invokeSomeMethod()).thenReturn(nodeList);

    ClassToBeTested classTest = …
Run Code Online (Sandbox Code Playgroud)

java multithreading unit-testing java-stream

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

自动删除SQS队列

有没有办法完全自动删除SQS队列.我有一个解决方案,其中启动时的服务器创建SQS并订阅SNS主题.

然而,可能存在服务器崩溃并且不可恢复的情况.在这种情况下,我会用不同的服务器替换服务器,这将在启动时创建自己的队列.现在不再使用较早的队列了.

是否有一种方法可以让队列自动删除并明确删除它(可能就像队列在5天内保持空白,它会被自动删除或其他一些替代方案)?

amazon-sqs amazon-web-services

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

使用默认 kms 密钥进行 s3 跨帐户访问

我的帐户中有一个 s3 存储桶,它使用默认aws-kms密钥启用了 SSE。我希望向我的存储桶提供另一个帐户的读取权限。

我已按照以下链接提供访问权限: https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-denied-error-s3/

我正在使用aws s3 ls <s3://bucket_name>aws s3 cp <path to s3 object> . 下载该对象

我尝试在未启用 SSE 的情况下提供对存储桶的跨账户访问。我成功地检索了存储桶详细信息并下载了对象。但是,当我尝试从启用了 SSE 的存储桶下载对象时,出现An error occurred (AccessDenied) when calling the GetObject operation: Access Denied异常。我可以列出启用 SSE 的存储桶中的对象,但不能下载它们。

我的存储桶政策:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<Account_B_AWS_Account_Id>:role/ReadOnly"
                ]
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket-name>",
                "arn:aws:s3:::<bucket-name>/*"
            ]
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": { …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services amazon-iam

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

通道 3:打开失败:连接失败:连接被拒绝

我正在尝试调试远程应用程序。我在服务器上启动了一个 SOCKS 代理:ssh -D 9999 主机名

然后我尝试从我的 eclipse 调试设置连接到它,其中主机名相同且端口 = 9999。

但是我得到错误: channel 3: open failed: connect failed: Connection refused

我还更新了 eclipse 网络连接以允许 SOCKS 代理。该配置适用于同一网络中的不同主机名。

我无法解释此错误消息。有人可以帮助我出错的地方吗?我看着这个:SSH -L 连接成功,但本地主机端口转发不起作用“通道 3:打开失败:连接失败:连接被拒绝”但在我的情况下确实发现它很有用。

我在调试模式下在远程服务器上启动了我的进程,监听了一个特定的端口 4111 我确认调试端口是通过netstat -a命令打开的

谢谢

java eclipse ssh

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

Cloudformation:一起使用 Fn::Join 和 Fn:GetAtt

我试图在Type: AWS::Lambda::EventSourceMapping 下面的属性之一中定义值是我的片段(最新尝试):

FunctionName: #trigger the echo function previously defined
        "Fn::Join": [":", [{"Fn::GetAtt" : ["LambdaName", "Arn"]}, "live" ]]
Run Code Online (Sandbox Code Playgroud)

但是,我的云形成堆栈无法部署并出现以下错误:

"StatusReason": "Template error: every Fn::Join object requires two parameters, (1) a string delimiter and (2) a list of strings to be joined or a function that returns a list of strings (such as Fn::GetAZs) to be joined."

我已经尝试了几个带有括号的变体,但是一直出现相同的错误。我在语法中缺少什么?

PS我在yaml文件中定义这个

amazon-web-services aws-cloudformation aws-lambda

4
推荐指数
1
解决办法
3089
查看次数

Mockito 部分参数模拟

我正在尝试用java编写单元测试。下面是我的代码片段

类 Temp { 公共 void 方法() {

       return someObject.someMethod(param1, param2, param3, param4, param5);
   }
}
Run Code Online (Sandbox Code Playgroud)

测试方法:

@Test
public void testMethod() {

     Mokito.when(someObjectMock.someMethod(Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyBoolean(),
                    false)). thenReturn(true);

     boolean status = temp.method();

     Assert.assertEquals(true, status);
}
Run Code Online (Sandbox Code Playgroud)

然而,在执行测试用例时,我遇到以下错误:

 Invalid Use of argument matchers !
 5 matchers expected, 4 recorded
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的,它期望传递的所有参数都被模拟。但这不是我想要的,我希望模拟前 4 个参数,并根据第 5 个参数(true 或 false),然后指定该方法的适当返回值。

有办法解决这个问题吗?

谢谢

java unit-testing matcher mockito

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

使用泛型与POJO

我希望根据使用泛型的输入从方法返回多个不同的POJO对象响应.POJO不是层次结构的一部分,即完全独立的POJO

//POJO1
class A1  implements Serializable {

   // Instance variable with getter and setter

}

//POJO2
class B1 implements Serializable {

  // Instance variable with getter and setter

}


class XYZ {

   private ObjA objA;
   private ObjB objB;

   public <T>Optional<T>  getResponse(String input) {


       if(input.equals("A")) {       
           return objA.getResponse();  // This returns an optional of POJO A1 or Optional.empty()
       } else {
           return objB.getResponse();  // This returns an optional of POJO B1 or Optional.empty()
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误 Incompatible types. Required Optional<T> …

java generics optional

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

Perl重试闹钟

我试图在触发警报时重试某些逻辑.那可能吗.我已将警报定义如下:

local $SIG{ALRM} = sub {
         if($attempt <=5) {
              print "NExt attempt\n";
              $attempt = $attempt + 1;
              my $val = subroutine_call();
         } else{
         Carp::confess "Die now\n"; 
         }
Run Code Online (Sandbox Code Playgroud)

我的代码段如下:

 foreach my $x (@array)
 {
     eval {
        alarm(2);
        my $val = subroutine_call();
        alarm(0);
     };

     print "Moving on \n";
     ## some code
  }
Run Code Online (Sandbox Code Playgroud)

我希望在终止应用程序之前触发警报时重试调用subroutine_call最多3次.调用subrountine_call后(无论是否在触发警报后调用),都应显示print语句.

我知道一旦触发警报并且通过警报定义生成subrountine_call,代码流就会偏离,并且它不会执行print语句.我希望它表现得好像如果警报没有被触发就会有.

那可能吗?我持怀疑态度,但想知道是不是这样.

谢谢,

error-handling perl perl-module alarm

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

S3事件通知的实时性

我对对象的流量生命周期(即创建和删除对象的时间)感兴趣。一种方法是定期扫描存储桶并明确跟踪lastModifiedTime并与之前的扫描结果进行比较以识别已删除的对象。

我正在考虑的另一个替代方案是启用 S3 事件通知。但是,通知中的数据不包含该对象的lastModifiedTime。可以eventTime用作代理吗?是否能保证事件发送的速度?就我而言,如果事件的交付延迟是可以接受的;只要eventTime不晚于modificationTime对象的时间

另外,还有其他替代方法来捕获 s3 对象的生命周期吗?

amazon-s3 amazon-web-services amazon-cloudwatch-events

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