diff --git a/Modules/Filtering/ImageManipulation/test/otbFunctorImageFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbFunctorImageFilter.cxx
index e0d2c1535ed8dc64bb2d379a112e8ba3170389ba..814e07a8112117fca3141cdd734861aa328e07d5 100644
--- a/Modules/Filtering/ImageManipulation/test/otbFunctorImageFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbFunctorImageFilter.cxx
@@ -36,59 +36,83 @@ template <typename T> struct TypesCheck
 {
   using ScalarType                    = T;
   using ImageType                     = otb::Image<T>;
-  using ComplexType                   = std::complex<ScalarType>;
-  using ComplexImageType              = otb::Image<ComplexType>;
   using VectorType                    = itk::VariableLengthVector<ScalarType>;
   using VectorImageType               = otb::VectorImage<ScalarType>;
-  using ComplexVectorType             = itk::VariableLengthVector<ComplexType>;
-  using ComplexVectorImageType        = otb::VectorImage<ComplexType>;
   using NeighborhoodType              = itk::Neighborhood<ScalarType>;
-  using ComplexNeighborhoodType       = itk::Neighborhood<ComplexType>;
   using VectorNeighborhoodType        = itk::Neighborhood<VectorType>;
-  using ComplexVectorNeighborhoodType = itk::Neighborhood<ComplexVectorType>;
   
+  // Test IsNeighborhood struct
   static_assert(!otb::IsNeighborhood<ScalarType>::value,"");
-  static_assert(!otb::IsNeighborhood<ComplexType>::value,"");
   static_assert(!otb::IsNeighborhood<VectorType>::value,"");
-  static_assert(!otb::IsNeighborhood<ComplexVectorType>::value,"");
-
   static_assert(otb::IsNeighborhood<NeighborhoodType>::value,"");
-  static_assert(otb::IsNeighborhood<ComplexNeighborhoodType>::value,"");
   static_assert(otb::IsNeighborhood<VectorNeighborhoodType>::value,"");
-  static_assert(otb::IsNeighborhood<ComplexVectorNeighborhoodType>::value,"");
-
   static_assert(otb::IsNeighborhood<const NeighborhoodType &>::value,"");
-  static_assert(otb::IsNeighborhood<const ComplexNeighborhoodType &>::value,"");
   static_assert(otb::IsNeighborhood<const VectorNeighborhoodType &>::value,"");
-  static_assert(otb::IsNeighborhood<const ComplexVectorNeighborhoodType &>::value,"");
 
+  // Test PixelTypeDeduction struct
   static_assert(std::is_same<typename PixelTypeDeduction<ScalarType>::PixelType,ScalarType>::value,"");
-  static_assert(std::is_same<typename PixelTypeDeduction<ComplexType>::PixelType,ComplexType>::value,"");
   static_assert(std::is_same<typename PixelTypeDeduction<VectorType>::PixelType,VectorType>::value,"");
-  static_assert(std::is_same<typename PixelTypeDeduction<ComplexVectorType>::PixelType,ComplexVectorType>::value,"");
-
   static_assert(std::is_same<typename PixelTypeDeduction<NeighborhoodType>::PixelType,ScalarType>::value,"");
-  static_assert(std::is_same<typename PixelTypeDeduction<ComplexNeighborhoodType>::PixelType,ComplexType>::value,"");
   static_assert(std::is_same<typename PixelTypeDeduction<VectorNeighborhoodType>::PixelType,VectorType>::value,"");
-  static_assert(std::is_same<typename PixelTypeDeduction<ComplexVectorNeighborhoodType>::PixelType,ComplexVectorType>::value,"");
-
   static_assert(std::is_same<typename PixelTypeDeduction<const NeighborhoodType &>::PixelType,ScalarType>::value,"");
-  static_assert(std::is_same<typename PixelTypeDeduction<const ComplexNeighborhoodType &>::PixelType,ComplexType>::value,"");
   static_assert(std::is_same<typename PixelTypeDeduction<const VectorNeighborhoodType &>::PixelType,VectorType>::value,"");
-  static_assert(std::is_same<typename PixelTypeDeduction<const ComplexVectorNeighborhoodType &>::PixelType,ComplexVectorType>::value,"");
 
+  // Test ImageTypeDeduction struct
   static_assert(std::is_same<typename ImageTypeDeduction<ScalarType>::ImageType,ImageType>::value,"");
-  static_assert(std::is_same<typename ImageTypeDeduction<ComplexType>::ImageType,ComplexImageType>::value,"");
   static_assert(std::is_same<typename ImageTypeDeduction<VectorType>::ImageType,VectorImageType>::value,"");
-  static_assert(std::is_same<typename ImageTypeDeduction<ComplexVectorType>::ImageType,ComplexVectorImageType>::value,"");
-
   static_assert(std::is_same<typename ImageTypeDeduction<const ScalarType &>::ImageType,ImageType>::value,"");
-  static_assert(std::is_same<typename ImageTypeDeduction<const ComplexType &>::ImageType,ComplexImageType>::value,"");
   static_assert(std::is_same<typename ImageTypeDeduction<const VectorType &>::ImageType,VectorImageType>::value,"");
-  static_assert(std::is_same<typename ImageTypeDeduction<const ComplexVectorType &>::ImageType,ComplexVectorImageType>::value,"");
+
+  // Fake test operator
+  template <typename TOut,typename TIn> struct TestOperator
+  {
+    auto operator()(const TIn&) const
+    {
+      TOut res(OutputSize());
+      return res;
+    }
+    
+    constexpr size_t OutputSize(...) const
+    {
+      return 1;
+    }
+  };
+
+    
+  template <typename TOut, typename TIn> void TestFilter()
+  {
+  // Deduce types
+  using InputPixelType = typename PixelTypeDeduction<TIn>::PixelType;
+  using InputImageType = typename ImageTypeDeduction<InputPixelType>::ImageType;
+
+  // Allocate fake input
+  auto in = InputImageType::New();
+  typename InputImageType::SizeType size = {{10,10}};
+  in->SetRegions(size);
+  in->SetNumberOfComponentsPerPixel(1);
+  in->Allocate();
+  InputPixelType defaultValue(1);
+  in->FillBuffer(defaultValue);
+
+  // Build and run filter
+  auto functor = TestOperator<TOut,TIn>{};
+  auto filter = NewFunctorFilter(functor);
+  filter->SetVInputs(in);
+  filter->Update();
+  }
+
+  TypesCheck()
+  {
+  // Test possible combinations
+  TestFilter<ScalarType,ScalarType>();
+  TestFilter<ScalarType,VectorType>();
+  TestFilter<ScalarType,NeighborhoodType>();
+  TestFilter<VectorType,ScalarType>();
+  } 
 };
 
 auto checksDouble = TypesCheck<double>{};
+auto checksComplex = TypesCheck<std::complex<double>>{};
 
 // Example functors